>백엔드 개발 >PHP 튜토리얼 >주어진 날짜 형식 'YYYY-mm-dd'에 따라 해당 날짜가 위치한 주의 시작일을 구합니다.

주어진 날짜 형식 'YYYY-mm-dd'에 따라 해당 날짜가 위치한 주의 시작일을 구합니다.

WBOY
WBOY원래의
2016-07-25 08:50:201088검색
常用日期操作
  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<=$end_week_num;$i ){
  41. $start_date = date("Y-m-d", strtotime("$begin_day $j week"));
  42. $end_day = date("Y-m-d", strtotime($start_date . ' 6 day'));
  43. $week_arr[$year][$i] = array(
  44. $start_date,
  45. $end_day
  46. );
  47. $j ;
  48. }
  49. if($end_day_next){
  50. $week_arr[$stride_year][$stride_weeknum] = array(
  51. $end_day_next,
  52. date("Y-m-d", strtotime($end_day_next . ' 6 day'))
  53. );
  54. }
  55. return $week_arr;
  56. }
  57. //demo_调用
  58. /*
  59. $year = '2013';
  60. if(get_all_weeks($year)){
  61. var_dump(get_all_weeks($year));
  62. }else{
  63. echo '日期格式出错';
  64. }
  65. */
  66. /**
  67. * 获取某一天所在周的起始日期
  68. * 依赖 function get_all_weeks
  69. * @param $day 格式:'YYYY-mm-dd'
  70. * 返回false 日期格式错误
  71. * 正确,返回json "{"begin_day":"YYYY-mm-dd","end_day":"YYYY-mm-dd"}"
  72. */
  73. function get_day_week($day){
  74. $date_arr = explode('-', trim($day));
  75. if(!checkdate(intval($date_arr[1]), intval($date_arr[2]), intval($date_arr[0]))){
  76. return false;
  77. }
  78. $year = date('Y',strtotime($day));
  79. $weeks = get_all_weeks($year);
  80. //某一天所属的年份与周数
  81. $real_year = date('o',strtotime($day));
  82. $week_num = intval(date('W',strtotime($day)));
  83. if(!empty($weeks[$real_year][$week_num][0]))
  84. $begin_day = $weeks[$real_year][$week_num][0];
  85. if(!empty($weeks[$real_year][$week_num][1]))
  86. $end_day = $weeks[$real_year][$week_num][1];
  87. //跨年周数值存储于上一年中
  88. if(empty($begin_day)||empty($end_day)){
  89. $year = date('Y',strtotime($day))-1;
  90. $weeks = get_all_weeks($year);
  91. $real_year = date('o',strtotime($day));
  92. $week_num = intval(date('W',strtotime($day)));
  93. if(!empty($weeks[$real_year][$week_num][0]))
  94. $begin_day = $weeks[$real_year][$week_num][0];
  95. if(!empty($weeks[$real_year][$week_num][1]))
  96. $end_day = $weeks[$real_year][$week_num][1];
  97. }
  98. $the_day = array(
  99. 'begin_day' => $begin_day,
  100. 'end_day' => $end_day
  101. );
  102. $the_day = json_encode($the_day);
  103. return $the_day;
  104. }
  105. //demo_调用
  106. /*
  107. $day = '2014-01-01';
  108. if(get_day_week($day)){
  109. var_dump(get_day_week($day));
  110. }else{
  111. echo '日期格式出错';
  112. }
  113. */
复制代码


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