欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-05-16 22:00:23
...
常用日期操作
  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. */
复制代码