ホームページ  >  記事  >  バックエンド開発  >  指定された日付形式「YYYY-mm-dd」に従って、その日付が位置する週の開始日を取得します。

指定された日付形式「YYYY-mm-dd」に従って、その日付が位置する週の開始日を取得します。

WBOY
WBOYオリジナル
2016-07-25 08:50:201036ブラウズ
一般的な日付操作
  1. /**
  2. * 一年のすべての週の開始日を取得します
  3. * @param $year format 'YYYY'
  4. * 年の特定の日が含まれる実際の年に対応する 2 次元配列の添え字 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. //One年 先週の日曜日
  23. if(date('w',strtotime($end_day))!=0){
  24. $end_day = date('Y-m-d',strtotime("最後の日曜日",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. //年の最初の月曜日は、年の第 1 週または第 2 週です
  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 year"));
  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_call
  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. * get_all_weeks 関数に依存します
  69. * @param $day format: '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 =爆発(' -', トリム($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($日)));
  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_call
  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 までご連絡ください。