最近在做大数据统计分析需求,经常会用到一些统计,比如,周统计,环比等 ,下面我们来计算一年有多少个 自然 周,直接上代码吧:

 /*** 获取一年每周的开始日期和结束日期* @param $year* @return array*/public function get_week($year){$whole_week = $this->get_big_week($year);//获取最大周数$str = '';for ($i = 1; $i <= $whole_week; $i++) {$str .= $i . ',';}$str_arr = explode(',', rtrim($str, ','));//转成数组$week_list = array();foreach ($str_arr as $key => $value) {$week = $this->get_year_month_week($year, $value);//一周的日期$week_list[$value] = [0 => $week[0],1 => $week[6],];}$firstWeek = $week_list[1];// 第一周$firstWeekDay = date('d',strtotime($firstWeek[0]));$firstYear = date('Y',strtotime($firstWeek[0]));$endYear = date('Y',strtotime($firstWeek[1]));$addWeek = $newWeekList = [];if($firstWeekDay > 1){if($firstYear != $endYear){ //跨年$week_list[1][0]=  date('Y-m-d' ,mktime(0, 0, 0, 1,1, date($year)));$newWeekList = $week_list;} else { //不跨年$addWeek = [0 => date('Y-m-d' ,mktime(0, 0, 0, 1,1, date($year))),1 => date('Y-m-d', strtotime($firstWeek[0]) - 24 *3600),];$newWeekList = $this->add_week($addWeek, $week_list);}} else {$newWeekList = $week_list;}$endWeek = end($newWeekList);// 最后一周$endWeekYear = date('Y',strtotime($endWeek[1]));$startWeekYear = date('Y',strtotime($endWeek[0]));$currentYear = date('Y',time());if($endWeekYear != $currentYear){ //跨年了$lastday = date("Y-m-t", strtotime('next month', strtotime("{$currentYear}-11-01")));$weekNum = count($newWeekList);foreach($newWeekList as $key=>&$week){if($weekNum == $key){$week[1] = $lastday;}}$endWeek[1] = date('Y-m-t', strtotime($year."-12-01"));}$weekNum = count($newWeekList);$newWeekList[$weekNum][1] = date('Y-m-t', strtotime($year."-12-01"));return $newWeekList;}public function add_week($addWeek, $week_list){if(!$addWeek) return $week_list;$newWeekList = [];$week_list = array_merge([$addWeek],$week_list);foreach($week_list as $key=>$week){$newWeekList[$key+1] = $week;}return $newWeekList;}public function get_date($return, $string, $date){if (empty($return)) {$return = "Y-m-d";}if (empty($string)) {$string = "now";}if (empty($date)) {$date = time();} else {$date = strtotime(date($date));}if (preg_match("/month/", $string)) {$first_day_of_month = date('Y-m', $date) . '-01';$str_date = strtotime($first_day_of_month);}if (preg_match("/month/", $string)) {$l_date = date("Y-m-d", strtotime($string, $str_date));$day = substr(date("Y-m-d", $date), 8, 2);if (substr($l_date, 0, 7) . '-' . date('t', strtotime(substr($l_date, 0, 7))) < substr($l_date, 0, 7) . '-' . $day) {$l_date = substr($l_date, 0, 7) . '-' . date('t', strtotime(substr($l_date, 0, 7)));} else {$l_date = substr($l_date, 0, 7) . '-' . $day;}$l_date = date($return, strtotime($l_date));return $l_date;} else {return date($return, strtotime($string, $date));}}public function get_big_week($year_now){$big_week = $this->get_date("W", NULL, $year_now . '-12-31');if ($big_week == 1) {$big_week = $this->get_date("W", NULL, $year_now . '-12-30');}if ($big_week == 1) {$big_week = $this->get_date("W", NULL, $year_now . '-12-29');}if ($big_week == 1) {$big_week = $this->get_date("W", NULL, $year_now . '-12-28');}if ($big_week == 1) {$big_week = $this->get_date("W", NULL, $year_now . '-12-27');}if ($big_week == 1) {$big_week = $this->get_date("W", NULL, $year_now . '-12-26');}if ($big_week == 1) {$big_week = $this->get_date("W", NULL, $year_now . '-12-25');}if ($big_week == 1) {$big_week = $this->get_date("W", NULL, $year_now . '-12-24');}return $big_week;}public function get_year_month_week($year_now, $week_now){//指定年和周的日期数组$time = new \DateTime();$time->setISODate($year_now, $week_now, 1);$result[] = $time->format('Y-m-d');$time->setISODate($year_now, $week_now, 2);$result[] = $time->format('Y-m-d');$time->setISODate($year_now, $week_now, 3);$result[] = $time->format('Y-m-d');$time->setISODate($year_now, $week_now, 4);$result[] = $time->format('Y-m-d');$time->setISODate($year_now, $week_now, 5);$result[] = $time->format('Y-m-d');$time->setISODate($year_now, $week_now, 6);$result[] = $time->format('Y-m-d');$time->setISODate($year_now, $week_now, 7);$result[] = $time->format('Y-m-d');return $result;}/*** 获取当前周的起止时间* @param $currentWeek* @param $weeklist* @return int|string*/public function setCurrentWeek($currentWeek, $weeklist) {if(!$weeklist || !$currentWeek) return 1;$week_start = $currentWeek['week_start'];foreach($weeklist as $key=>$week){if($week_start == $week[0]){return $key;}}}/*PHP获取当前日期是第几周和本周开始日期和本周结束日期*/public function getNowTimeInfo($now) {$str = array();//$first =1 表示每周星期一为开始日期 0表示每周日为开始日期$str['year'] = date('Y', strtotime($now));$first = 1;//当日在整年中的第几周$str['week'] = date('W', strtotime($now));//获取当前周的第几天 周日是 0 周一到周六是 1 - 6$w = date('w', strtotime($now));//获取本周开始日期,如果$w是0,则表示周日,减去 6 天$week_start = date('Y-m-d', strtotime("$now -" . ($w ? $w - $first : 6) . ' days'));$str['week_start'] = $week_start;//本周结束日期$week_end = date('Y-m-d', strtotime("$week_start +6 days"));$str['week_end'] = $week_end;return $str;}

这样我们就可以获取当前是第几周,以及起止时间:

 $weekFormat = new WeekFormatLogic();$date = date("Y-m-d",time());$currentWeek =  $weekFormat->getNowTimeInfo($date);$year = date("Y",time());$weeklist = $weekFormat->get_week($year);return  $weekFormat->setCurrentWeek($currentWeek, $weeklist);

可以看到当前是滴29周:

起止时间为:

Array
([week_start] => 2021-07-12[week_end] => 2021-07-18
)

全部周的起止时间:

Array
([1] => Array([0] => 2021-01-01[1] => 2021-01-03)[2] => Array([0] => 2021-01-04[1] => 2021-01-10)[3] => Array([0] => 2021-01-11[1] => 2021-01-17)[4] => Array([0] => 2021-01-18[1] => 2021-01-24)[5] => Array([0] => 2021-01-25[1] => 2021-01-31)[6] => Array([0] => 2021-02-01[1] => 2021-02-07)[7] => Array([0] => 2021-02-08[1] => 2021-02-14)[8] => Array([0] => 2021-02-15[1] => 2021-02-21)[9] => Array([0] => 2021-02-22[1] => 2021-02-28)[10] => Array([0] => 2021-03-01[1] => 2021-03-07)[11] => Array([0] => 2021-03-08[1] => 2021-03-14)[12] => Array([0] => 2021-03-15[1] => 2021-03-21)[13] => Array([0] => 2021-03-22[1] => 2021-03-28)[14] => Array([0] => 2021-03-29[1] => 2021-04-04)[15] => Array([0] => 2021-04-05[1] => 2021-04-11)[16] => Array([0] => 2021-04-12[1] => 2021-04-18)[17] => Array([0] => 2021-04-19[1] => 2021-04-25)[18] => Array([0] => 2021-04-26[1] => 2021-05-02)[19] => Array([0] => 2021-05-03[1] => 2021-05-09)[20] => Array([0] => 2021-05-10[1] => 2021-05-16)[21] => Array([0] => 2021-05-17[1] => 2021-05-23)[22] => Array([0] => 2021-05-24[1] => 2021-05-30)[23] => Array([0] => 2021-05-31[1] => 2021-06-06)[24] => Array([0] => 2021-06-07[1] => 2021-06-13)[25] => Array([0] => 2021-06-14[1] => 2021-06-20)[26] => Array([0] => 2021-06-21[1] => 2021-06-27)[27] => Array([0] => 2021-06-28[1] => 2021-07-04)[28] => Array([0] => 2021-07-05[1] => 2021-07-11)[29] => Array([0] => 2021-07-12[1] => 2021-07-18)[30] => Array([0] => 2021-07-19[1] => 2021-07-25)[31] => Array([0] => 2021-07-26[1] => 2021-08-01)[32] => Array([0] => 2021-08-02[1] => 2021-08-08)[33] => Array([0] => 2021-08-09[1] => 2021-08-15)[34] => Array([0] => 2021-08-16[1] => 2021-08-22)[35] => Array([0] => 2021-08-23[1] => 2021-08-29)[36] => Array([0] => 2021-08-30[1] => 2021-09-05)[37] => Array([0] => 2021-09-06[1] => 2021-09-12)[38] => Array([0] => 2021-09-13[1] => 2021-09-19)[39] => Array([0] => 2021-09-20[1] => 2021-09-26)[40] => Array([0] => 2021-09-27[1] => 2021-10-03)[41] => Array([0] => 2021-10-04[1] => 2021-10-10)[42] => Array([0] => 2021-10-11[1] => 2021-10-17)[43] => Array([0] => 2021-10-18[1] => 2021-10-24)[44] => Array([0] => 2021-10-25[1] => 2021-10-31)[45] => Array([0] => 2021-11-01[1] => 2021-11-07)[46] => Array([0] => 2021-11-08[1] => 2021-11-14)[47] => Array([0] => 2021-11-15[1] => 2021-11-21)[48] => Array([0] => 2021-11-22[1] => 2021-11-28)[49] => Array([0] => 2021-11-29[1] => 2021-12-05)[50] => Array([0] => 2021-12-06[1] => 2021-12-12)[51] => Array([0] => 2021-12-13[1] => 2021-12-19)[52] => Array([0] => 2021-12-20[1] => 2021-12-26)[53] => Array([0] => 2021-12-27[1] => 2021-12-31))

当然了,这里计算的时候是从元旦开始计算的,起止周可能不满足7天,中间其他的周都是正常的

数据统计获取一年 有多少个自然周,起止时间,当前是第几个周相关推荐

  1. java 获取当前时间所在自然周起止时间及自然周中的每一天

    有的时候需要获取当前时间所在自然周中的起始和截止时间,或者某个时间段内里的每一天的日期 1.先来解决获取自然周中的起止时间 /*** 获取当前时间所在自然周的起止日期** @return*/publi ...

  2. 「Python|场景案例」如何获取音视频中声音片段的起止时间?

    本文主要介绍如何使用python的第三方库moviepy找出音视频中声音开始出现的位置以及声音结束的位置. 文章目录 场景描述 准备工作 解决方案 源代码 场景描述 假设我们有一段音频,音频开始有一段 ...

  3. Java8 LocalDateTime 获取当前日周月年的起止时间

    Java8 LocalDateTime 常见使用_获取当天.本周.本月.本季度.本年度起止时间 一.返回 LocalDateTime 格式的起止时间 二.返回 String 格式的起止时间 一.返回 ...

  4. Java 获取当前时间周数,及根据周数获取周的起止时间

    package com.hr.weekly.controller;import com.hr.weekly.utils.DateUtil; import java.text.ParseExceptio ...

  5. 数据结构与算法学习篇给你一个文件里面包含全国人民(14亿)的年龄数据(0~200),现在要你统计每一个年龄有多少人?

    给你一个文件里面包含全国人民(14亿)的年龄数据(0~180),现在要你统计每一个年龄有多少人? 限制: 给定机器为 单台+1CPU+1G内存.不得使用现成的容器,比如map等. 假设每个年龄数据为2 ...

  6. php 统计一周数据,如何获取本周、上周、本月、上个月数据的起止时间 PHP

    1.本周的起止时间,这个在网上搜,有很多,但大多都是不对的,代码程序毕竟是外国人研发出来的,按外国人的习惯,周日算下一周的开始,网上搜出来的大多是这样的,没有按国人的统计方式肯定不行的,所以就要做下判 ...

  7. pythin怎么根据月份获取月初和月末_数据统计丨7月份塑料市场明显回暖,8月份是否延续乐观行情?...

    据统计,2020年7月东莞市场现货总成交量为618959.83吨,同比上月减少1.02吨. 7月份塑料行情整体较好,虽然期间有回落走势,但较6月份行情来说明显回暖,现在看来7月份塑料行情仍以小涨为主. ...

  8. Linux高效数据统计命令wc

    2019独角兽企业重金招聘Python工程师标准>>> wc(world count)是一个统计文件字词,字节,行数的命令,它可以帮我们非常方便的统计以上信息. 主要参数 常见参数如 ...

  9. 在Sqlserver下巧用行列转换日期的数据统计

    在Sqlserver下巧用行列转换日期的数据统计 原文:在Sqlserver下巧用行列转换日期的数据统计 在Sqlserver下巧用行列转换日期的数据统计 前言 在SQLSERVER 中有很多统计函数 ...

  10. linux 换行符_一个linux帮你做高效数据统计

    wc(world count)是一个统计文件字词,字节,行数的命令,它可以帮我们非常方便的统计以上信息. 主要参数 常见参数如下: -c 统计字节数. -l 统计行数. -m 统计字符数.这个标志不能 ...

最新文章

  1. 一种将快捷方式从开始菜单“常用应用”的中去除的方法
  2. 【STM32】FreeRTOS 系统内核控制函数
  3. 【深入Java虚拟机JVM 10】回收方法区
  4. kotlin集合操作符——映射操作符
  5. 阿里云 EMR Delta Lake 在流利说数据接入中的架构和实践
  6. NOX的使用之学习篇【一】
  7. 洛谷 P5660 数字游戏
  8. 华中数控hnc一818b_数控车床精确对刀方法总结
  9. fprintf,input和disp函数
  10. pytorch nonzero_[深度学习框架]PyTorch常用代码段
  11. 使用git向远程库发布项目和下载项目步骤,结合gitee部署远程库,HTTPS\SHH上传下载情况详解
  12. DDA算法、中点Bresenam算法,圆或椭圆的绘制
  13. VMware Workstation Pro网络配置(WiFi配置等)
  14. 我国标准与国际标准的关系
  15. 车贴服务器维修,汽车衡的故障分析及处理
  16. 【CISSP备考】考前情报收集
  17. 1.出现了 page[pages/XXX/XXX] not found.May be caused by :1. Forgot to add page route in app.json.2. Inv
  18. mysql 删除check_数据库中五种check约束添加/删除方法
  19. OSChina 周四乱弹 ——不是二奶不是寡妇,老娘的男人是程序员
  20. 【目标检测无痛涨点篇】SWA:平均多个模型权值

热门文章

  1. python ui自动化面试题_UI自动化面试题
  2. 分享一个空手反套白狼的骚操作
  3. CC00075.bigdatajava——|Java循环结构.V14|——|Java.v14|while循环.v02|实现调和数列累加和|
  4. excel如何设置保留两位小数
  5. 罗茨气体流量计的结构设计
  6. 第十三届蓝桥杯C B组 J:砍竹子
  7. windows通过bat运行指定位置程序及设置开机自启
  8. x内存满白苹果解决_苹果x出现白苹果的现象及解决办法
  9. SiamRPN代码分析:architecture
  10. 大数据时代的 10 个重大变化