>  기사  >  백엔드 개발  >  根据给定的日期格式'YYYY-mm-dd',获取该日期所在周的起始日期

根据给定的日期格式'YYYY-mm-dd',获取该日期所在周的起始日期

WBOY
WBOY원래의
2016-07-25 08:50:201036검색
常用日期操作
  1. /**
  2. * 获取一年中所有星期的起始日期
  3. * @param $year 格式 'YYYY'
  4. * 返回二维数组 下标 key1值对应一年中某一天所在周的实际年份 key2值对应一年中某一天所在的周数[一年中第几周]
  5. * 返回false 日期格式错误
  6. */
  7. function get_all_weeks($year){
  8. $week_arr = array();
  9. $year = intval(trim($year));
  10. $preg = "/^\d{4,}$/";
  11. if(!preg_match($preg, $year)){
  12. return false;
  13. }
  14. $begin_day = $year . '-01-01';
  15. $end_day = $year . '-12-31';
  16. //一年第一个星期一
  17. if(date('w',strtotime($begin_day))!=1){
  18. $begin_day = date('Y-m-d',strtotime("next monday", strtotime($begin_day)));
  19. }
  20. //第一个星期一所在周数
  21. $begin_week_num = intval(date('W',strtotime($begin_day)));
  22. //一年最后一个星期天
  23. if(date('w',strtotime($end_day))!=0){
  24. $end_day = date('Y-m-d',strtotime("last sunday",strtotime($end_day)));
  25. //存在跨年的星期,跨年所在周星期一
  26. $end_day_next = date('Y-m-d',strtotime($end_day)+24*60*60);
  27. //跨年星期所属年份与所在周数
  28. $stride_year = date('o',strtotime($end_day_next));
  29. $stride_weeknum = intval(date('W',strtotime($end_day_next)));
  30. }
  31. //最后一个星期天所在周数
  32. $end_week_num = intval(date('W',strtotime($end_day)));
  33. //一年第一个周一为一年的第一周或者第二周
  34. if($begin_week_num!=1){
  35. $i=2;
  36. }else{
  37. $i=1;
  38. }
  39. $j = 0;
  40. for($i;$i $start_date = date("Y-m-d", strtotime("$begin_day $j week"));
  41. $end_day = date("Y-m-d", strtotime($start_date . '+6 day'));
  42. $week_arr[$year][$i] = array(
  43. $start_date,
  44. $end_day
  45. );
  46. $j++;
  47. }
  48. if($end_day_next){
  49. $week_arr[$stride_year][$stride_weeknum] = array(
  50. $end_day_next,
  51. date("Y-m-d", strtotime($end_day_next . '+6 day'))
  52. );
  53. }
  54. return $week_arr;
  55. }
  56. //demo_调用
  57. /*
  58. $year = '2013';
  59. if(get_all_weeks($year)){
  60. var_dump(get_all_weeks($year));
  61. }else{
  62. echo '日期格式出错';
  63. }
  64. */
  65. /**
  66. * 获取某一天所在周的起始日期
  67. * 依赖 function get_all_weeks
  68. * @param $day 格式:'YYYY-mm-dd'
  69. * 返回false 日期格式错误
  70. * 正确,返回json "{"begin_day":"YYYY-mm-dd","end_day":"YYYY-mm-dd"}"
  71. */
  72. function get_day_week($day){
  73. $date_arr = explode('-', trim($day));
  74. if(!checkdate(intval($date_arr[1]), intval($date_arr[2]), intval($date_arr[0]))){
  75. return false;
  76. }
  77. $year = date('Y',strtotime($day));
  78. $weeks = get_all_weeks($year);
  79. //某一天所属的年份与周数
  80. $real_year = date('o',strtotime($day));
  81. $week_num = intval(date('W',strtotime($day)));
  82. if(!empty($weeks[$real_year][$week_num][0]))
  83. $begin_day = $weeks[$real_year][$week_num][0];
  84. if(!empty($weeks[$real_year][$week_num][1]))
  85. $end_day = $weeks[$real_year][$week_num][1];
  86. //跨年周数值存储于上一年中
  87. if(empty($begin_day)||empty($end_day)){
  88. $year = date('Y',strtotime($day))-1;
  89. $weeks = get_all_weeks($year);
  90. $real_year = date('o',strtotime($day));
  91. $week_num = intval(date('W',strtotime($day)));
  92. if(!empty($weeks[$real_year][$week_num][0]))
  93. $begin_day = $weeks[$real_year][$week_num][0];
  94. if(!empty($weeks[$real_year][$week_num][1]))
  95. $end_day = $weeks[$real_year][$week_num][1];
  96. }
  97. $the_day = array(
  98. 'begin_day' => $begin_day,
  99. 'end_day' => $end_day
  100. );
  101. $the_day = json_encode($the_day);
  102. return $the_day;
  103. }
  104. //demo_调用
  105. /*
  106. $day = '2014-01-01';
  107. if(get_day_week($day)){
  108. var_dump(get_day_week($day));
  109. }else{
  110. echo '日期格式出错';
  111. }
  112. */
复制代码


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.