<?php error_reporting(E_ALL);/*** 日期控件* 取得一年中周信息以及学期中周信息,根据指定时间取得周信息**/
class Week{private $term_last = 1; //代表上学期 用于可能的学期分表联动private $term_next = 2; //代表下学期 用于可能的学期分表联动/*** 获取指定年指定周对应的周开始时间(单位秒)*  * @param int $sYear(参数1:年号,字符型或数值型 例:2011)* @param int $sWeekNo(参数2:周号,字符型或数值型 例:4)* @return int (时间戳型日期)*/public function getWeekNoToFirstDay($sYear,$sWeekNo){return strtotime($this->getWeekDay($sYear,$sWeekNo,1));}/*** 获取指定周的第几天的日期** @param int $year 年* @param int $wek 周* @param int $day天* @param string $format显示时间的格式* @return string $str*/public function getWeekDay($year,$week,$day,$format='Y-m-d'){$time=new DateTime();$time->setISODate($year,$week,$day);return $time->format($format);}/*** 功能:获取指定年周对应的日期范围文本** @param int $sYear (年号,字符型或数值型 例:2011)* @param int $sWeek (周号,字符型或数值型 例:4)* @return array 不带年份的日期范围文字例:['satrt_date'3.2,'end_date'=>3.8])*/public function getWeekNoToDateRange($sYear,$sWeekNo){$dateTemp=$this->getWeekNoToFirstDay($sYear,$sWeekNo);$arr = ['start_date'=>date('Y-m-d',$dateTemp),'end_date'=>date('Y-m-d',strtotime("+6 day",$dateTemp))];return $arr;}/** * 获取指定2个年周之间的周数** @param  int $from_year (开始年号,字符型或数值型 例:2011)* @param  int $from_week (开始周号,字符型或数值型例:4)* @param  int $end_year (结束年号,字符型或数值型 例:2011)* @param  int $end_week (结束周号,字符型或数值型 例:26)* @return int*/public function getWeekNoToTotalWeeks($from_year,$from_week,$end_year,$end_week){if(!$from_year or !$from_week or !$end_year or !$end_week){return -1;}$time_from_yearweek= $this->getWeekNoToFirstDay($from_year,$from_week);$time_end_yearweek = $this->getWeekNoToFirstDay($end_year,$end_week);$total_weeks=($time_end_yearweek-$time_from_yearweek)/86400/7;if($total_weeks >= 0){$total_weeks++;}return $total_weeks;}/*** 取得指定日期在年的第几周** @param  string $date 例: 2017-08-29* @return int*/public function getWeekForDate($date){$arr = $this->getWeekYearForDate($date);return $arr['week'];}/*** 取得指定日期在哪一年的哪一周** @param  string $date 例: 2017-08-29* @return array*/public function getWeekYearForDate($date){$int = date('oW',strtotime($date));$arr = ['year'=>substr($int,0,4),'week'=>substr($int,4)];return $arr;}/*** 取得指定年的最后一周开始时间** @param  int   $date 例: 2017* @return array*/public function getWeekExitDate($year){$week = $this->getYearWeeks($year);return $this->getWeekDay($year,$week,1);}/*** 取得指定年份一共有多少周** @param int $year* @return int;*/public function getYearWeeks($year){$date = new DateTime;$date->setISODate($year, 53);$weeks = max($date->format("W"),52);unset($date);return $weeks;}/*** 取得指定时间范围内的所有周的总列表时间范围信息(可跨年) - 含开始结束时间* 如果开始时间==结束时间,则可取出时间所在学期的第几周以及所在年的第几周以及周开始+结束时间范围** @param string $start_date 例:2017-09-01* @param string $end_date 例:2018-01-26* @param array array(1=>array(xx,xx,xx));*/public function getTermWeeks($start_date='2017-09-01',$end_date='2018-01-26'){$year_start = intval(substr(trim($start_date),0,4));$year_end = intval(substr(trim($end_date),0,4));$year_start_week_total = $this->getYearWeeks($year_start);     $year_end_week_total = $this->getYearWeeks($year_end);  //echo "<br/>{$year_start}年共几周:",$year_start_week_total,"|||{$year_end}年共几周:",$year_end_week_total,"<br/>";$year_start_date_week = $this->getWeekForDate($start_date); //开始时间属于开始年的第几周$year_end_date_week = $this->getWeekForDate($end_date); //结束时间属于结束年的第几周//echo "{$year_start}第几周开始:",$year_start_date_week,"||{$year_end}第几周结束",$year_end_date_week;//if($year_end>$year_start){$year_start_arr = $this->getYearWeeksList($year_start); //开始时间所在年的所有周的时间范围列表$year_end_arr = $this->getYearWeeksList($year_end); //结束时间所在年的所有周的时间范围列表//echo "{$year_start}年所有周:";//var_dump($year_start_arr);//echo "{$year_end}年所有周:";//var_dump($year_end_arr);$year_start_have_weeks_count = intval($year_start_date_week)-1; //取得开始周在数组中的第几项    $year_end_have_weeks_count = intval($year_end_date_week);//取得结束时间所在周在一年的第几周            //截取开始时间到年末的所有周的时间范围列表      $year_start_weeks = array_slice($year_start_arr,$year_start_have_weeks_count,$year_start_week_total,true);$year_end_weeks = array_slice($year_end_arr,0,$year_end_have_weeks_count,true);$arr = [];$i = 0;foreach($year_start_weeks as $k=>$v){$i++;  //year所在年,year_week_num所在年的第几周,term_week_num所在时间范围内的第几周,dates当前周时间范围            $arr[$i] = ['year'=>$year_start,'term'=>$this->term_last,'year_week_num'=>$k,'term_week_num'=>$i,'dates'=>$v];            }foreach($year_end_weeks as $k=>$v){$i++;$arr[$i] = ['year'=>$year_end,'term'=>$this->term_last,'year_week_num'=>$k,'term_week_num'=>$i,'dates'=>$v];       }//return $arr;}else{$year_start_arr = $year_end_arr = $this->getYearWeeksList($year_start);$year_start_have_weeks_count = intval($year_start_date_week)-1; //取得开始周在数组中的第几项   $year_end_have_weeks_count = intval($year_end_date_week);//-1;//取得结束时间所在周在一年的第几周$total_week = $year_end_have_weeks_count - $year_start_have_weeks_count;$year_start_end_weeks = array_slice($year_start_arr,$year_start_have_weeks_count,$total_week,true);$arr = [];$i = 0;foreach($year_start_end_weeks as $k=>$v){$i++;   //year所在年,year_week_num所在年的第几周,term_week_num所在时间范围内的第几周,dates当前周时间范围            $arr[$i] = ['year'=>$year_start,'term'=>$this->term_next,'year_week_num'=>$k,'term_week_num'=>$i,'dates'=>$v];            }//echo "{$year_start}年所有周:";//var_dump($year_start_arr);//return $arr;}$year_start_weeks = $year_end_arr = $year_start_weeks = $year_end_weeks = NULL;        if($start_date==$end_date && !empty($start_date) && !empty($arr)){$new_arr = [];foreach($arr as $v){$new_arr = $v;          }       return $new_arr;}return $arr;}/*** 取得(指定)一年当中所有周的时间范围(Key值为一年当中第几周,Value为周的日期范围)** @param int $year* @return array*/public function getYearWeeksList($year=''){if(empty($year)) $year = date('Y',time());$week_total = $this->getYearWeeks($year);$year_arr = [];for($i=1;$i<=$week_total;$i++){$year_arr[$i] = $this->getWeekNoToDateRange($year,$i);}return $year_arr;}/*** 取得指定日期在当前学期/指定时间范围的第几周** @param string $term_start_date (start Y-m-d)* @param string $term_end_date (end Y-m-d)* @param string $_date (this Y-m-d)* @param return int*/public function getDateWeekForTerm($term_start_date,$term_end_date,$_date=''){  $week = $this->getDateWeekInfoForTerm($term_start_date,$term_end_date,$_date);if(isset($week['term_week_num']))return intval($week['term_week_num']);return 0;}/*** 取得指定日期在当前学期第几周+年第几周+周开始结束日期范围** @param string $term_start_date (start Y-m-d)* @param string $term_end_date (end Y-m-d)* @param string $_date (this Y-m-d)* @param return array*/public function getDateWeekInfoForTerm($term_start_date,$term_end_date,$_date=''){$_date = trim($_date);$week_num=0;if(empty($_date)) $_date = date('Y-m-d',time());$arr = $this->getTermWeeks($term_start_date,$term_end_date);$tmp_date = str_replace('-','',$_date);foreach($arr as $v){if(isset($v['dates']['start_date']) && isset($v['dates']['end_date'])){$start = str_replace('-','',$v['dates']['start_date']);$end   = str_replace('-','',$v['dates']['end_date']);if(($tmp_date>=$start) && ($tmp_date<=$end)){$week = $v;break;}}}unset($arr);return $week;  }/*** 取得指定日期与学期对应的所在年的第几周该方法与getWeekForDate方法功能重复,仅仅在调试状态使用该方法用以验证学期推算功能的正确性,如果两个方法结果一致则正确无误** @param string $_date* @return int*/public function getDateWeekForYear($_date=''){if(empty($_date)) $_date = date('Y-m-d',time());$arr = $this->getTermWeeks($_date,$_date);if(isset($arr['year_week_num'])) return $arr['year_week_num']; }}echo "<hr/>";$W = new Week();
/*
echo "指定(学期)日期所在一年当中的第几周:";
$term_week = $W->getWeekForDate('2017-09-01');
echo $term_week;
echo "<br/>2017年最后一周开始时间:";
$last_week = $W->getWeekExitDate(2017);
echo $last_week;
echo "<br/>取得当前2014-12-29时间在一年当中的第几周:";
$the_date = date('Y-m-d',strtotime('2014-12-29'));
$the_week = $W->getWeekForDate($the_date);
echo $the_week;
echo "<br/>取得当前".date('Y-m-d',time())."时间在一年当中的第几周:";
$the_date = date('Y-m-d',time());
$the_week = $W->getWeekForDate($the_date);
echo $the_week;
echo "<br/>取得当前时间在本学期的第几周:";
echo intval($the_week - $term_week);
echo "<br/>取得元旦(2017-01-01)在新年的第几周:";
$yd_week = $W->getWeekForDate('2017-01-01');
echo $yd_week;
echo "<br/>取得2020年第一周开始时间:";
$_t = $W->getWeekNoToFirstDay(2020,1);
echo date('Y-m-d',$_t);
echo "<br/>取得指定周对应的日期范围";
$_fw = $W->getWeekNoToDateRange(2017,3);
var_dump($_fw);
echo "<hr/>";//按给定的年份计算本年周总数
echo "<hr/><br/><hr/>一年中所有周开始结束时间:<br/>";
$total_week = $W->getYearWeeks(2017);
$arr = [];
for($i=1;$i<=$total_week;$i++){$arr[$i] = $W->getWeekNoToDateRange(2017,$i);
}
echo "<pre>";
echo $total_week;
var_dump($arr);
echo "2017-09-01在2017年那一周:";
$week91 = $W->getWeekForDate('2017-09-01');
echo $week91;
echo "<br/>2018-01-26在2018年那一周:";
$week201831 = $W->getWeekForDate('2018-01-26');
echo $week201831;
$_date = '2017-12-31';
echo "<br/>{$_date}在(20171)新学期的第几周:";
echo $W->getWeekForDate($_date)-$week91+1;
echo "<br/>取得2017-09-01到2018-01-26一共多少周:";
echo $W->getWeekNoToTotalWeeks(2017,35,2018,4);
$total_week = $W->getYearWeeks(2018);
$arr2=[];
for($i=1;$i<=$total_week;$i++){$arr2[$i] = $W->getWeekNoToDateRange(2017,$i);
}
$week2017 = array_slice($arr,34,53,true);
var_dump($week2017);
$last_count = count($week2017);
for($i=1;$i<=4;$i++){$week2017[$i] = $arr2[$i];
}
var_dump($week2017);
*/
echo "<pre>";
echo "<hr/>2017-09-01~2018-01-26 20171学期:";
$week20171 = $W->getTermWeeks('2017-02-01','2017-08-31');
var_dump($week20171);
var_dump($week20171[30]);
var_dump($W->getWeekForDate('2017-02-01'));
var_dump($W->getTermWeeks('2017-02-01','2017-02-01'));
echo $W->getWeekNoToTotalWeeks(2017,5,2017,34);
$tmp_date ='2017-08-01';
echo "<br/>{$tmp_date}在年的第几周:";
echo $W->getDateWeekForYear($tmp_date),"||",$W->getWeekForDate($tmp_date);
echo "<br/>{$tmp_date}在学期第几周:",$W->getDateWeekForTerm('2017-02-01','2017-08-31',$tmp_date);
var_dump($W->getDateWeekInfoForTerm('2017-02-01','2017-08-31',$tmp_date));
?>摘取天上星-测试版

注释部分为调试所用,未及时清除请忽略!

根据指定时间范围取得对应(第几)周信息,以及一年当中所有周时间范围列表信息(可用于学期第几周,年第几周)相关推荐

  1. 开发者论坛一周精粹(第十四期):CVE-2017-7529:Nginx敏感信息泄露

    摘要: 2017年7月11日,Nginx官方发布最新的安全公告,漏洞CVE编号为CVE-2017-7529,该在nginx范围过滤器中发现了一个安全问题,通过精心构造的恶意请求可能会导致整数溢出并且不 ...

  2. SQL Server使用快捷键查看指定表的信息(字段、备注、索引、约束信息等)

    在我们工作,学习,开发中,为了快速了解业务,编写业务,需要了解相关的表的信息,下面这个SQL就很有必要了.这个SQL能让我们使用快捷键就能查看指定表的信息(字段.备注.索引.约束信息等),能让我们迅速 ...

  3. 根据年份获取周次,根据周次获取日期范围,获取当前年份,周次列表信息。

    在原文的基础上改的,适应我这边的需求,从周一开始到周日(姑且算个原创哈,原文链接在最下边). (1)根据年份获取周次 (2) 获取当前年份周次 (3) 根据选择周次获取日期时间范围 谁有更简单的方法也 ...

  4. js获取下月时间_js获取某周、某月、下月、某季度的开始日期、结束日期及判断日期第几周...

    //格式化日期:yyyy-MM-dd function formatDate(date) { var myyear = date.getFullYear(); var mymonth = date.g ...

  5. 利用element日期组件,封装季度组件, 实现日、周、月、季度切换,默认禁用部分日期选择(附带:获取昨日、昨日所在周、昨日所在月、昨日所在季度等方法)

    具体效果图下: 1. 季度组件封装,创建一个 quarterDate.vue文件 <!-- 季度组件 --> <template><div><el-popov ...

  6. 6月第1周安全回顾 Flash Player漏洞危机 邮件泄漏敏感信息

    本文同时发表在:[url]http://netsecurity.51cto.com/art/200806/75634.htm[/url] 本周(080526至080601)的信息安全威胁程度为低.   ...

  7. linux系统周几的格式是,linux cal命令显示日历信息周几天数差

    cal显示日历信息 功能描述: 使用cal命令可以显示计算机系统的日历 命令语法: cal[选项][月[年]] cal命令选项含义 选项含义 -j显示出给定月中的每一天是一年中的第几天(从1月1日算起 ...

  8. 一文学懂ansible

    目录 1. 文件模块 1.1 fetch 1.2 copy 1.3 file 1.4 blockinfile 1.5 lineinfile 1.6 find 1.7 replace 2. 命令模块 2 ...

  9. iPhone应用程序编程指南

    介绍 请注意:本文档之前命名为iPhone OS编程指南. iPhone SDK为创建iPhone的本地应用程序提供必需的工具和资源.在用户的Home屏幕上,iPhone的本地应用程序表示为图标.它们 ...

最新文章

  1. 数字广告领域的若干专业词汇汇总
  2. 20145223 《信息安全系统设计基础》课程总结
  3. 北京语言大学计算机调剂,北京语言大学2019考研调剂通知
  4. Spring中@Autowired和@Resource区别
  5. 【David Silver强化学习公开课】-3:DP
  6. word 论文排版 —— 按指定格式章节的自动编号
  7. SpringMVC学习笔记-新建工程及一些注意事项
  8. pandas分组计算平均值_pandas索引,分组计算
  9. day07【后台】SpringSecurity
  10. STM32 cubemx驱动ws2812b灯条
  11. 进销存财务管理重要性
  12. vs调试nuget包_NuGet包调试源码的方法
  13. 微信公众号与小程序对接文档
  14. 浏览器攻击框架BeEF简介
  15. OpenSSL sm2 签名源码讲解
  16. XML配置文件的读取
  17. Vagrant + VMBox 踩坑记录
  18. 2021-08-05,虾皮API,seller_info - 获得shopee店铺详情
  19. 深度学习上采样下采样概念以及实现
  20. C++课程设计(校车订票系统)

热门文章

  1. WIN10系统进入BIOS的方法(无需开机时按快捷键)
  2. 5M1E分析法—质量管理纵向无死角
  3. cc讲故事_停止讲故事
  4. Pixelmator for Mac(全能图像编辑软件)
  5. 【C++笔试强训】第三天
  6. Android分屏模式代码实现
  7. app式成语_app式的词语,app的成语都有什么?
  8. 配置web.xml文件时报The word ‘***‘ is not correctly spelled的解决方案
  9. 机器学习——回归中的相关度与R平方值及其应用
  10. 本科studying abroad 无法毕业申请硕士转学转校处理一切studying abroad 问题