Php日期返回意外的星期范围


Php Date Returning Unexpected Week Range

Php在给定特定日期的情况下返回一组意外的周日期。例如,给定日期2015-05-20,应返回的星期数为:

array:7 [
  0 => "2015-05-17"
  1 => "2015-05-18"
  2 => "2015-05-19"
  3 => "2015-05-20"
  4 => "2015-05-21"
  5 => "2015-05-22"
  6 => "2015-05-23"
]

或纯文本, 2015年5月17日至23日。从我可以告诉这个正确的。现在,给定日期2015-05-17,我得到以下结果:

array:7 [
  0 => "2015-05-10"
  1 => "2015-05-11"
  2 => "2015-05-12"
  3 => "2015-05-13"
  4 => "2015-05-14"
  5 => "2015-05-15"
  6 => "2015-05-16"
]

你会注意到是在17号之前的一周,或者 2015年5月11日至16日

这是拉动我的工作日的函数:

$days_of_week = array();
for($i = 0; $i <= 6; $i ++){
  $days_of_week[] = date("Y-m-d", strtotime(date("o", strtotime($date))."W".date("W", strtotime($date)).$i));
}

基本上,对于给定周数中的7天(在本例中为20天),将格式化的值推入数组(如上面的两个示例所示)。预格式化后,被推入的值为:

2015W200
2015W201
2015W202
2015W203
2015W204
2015W205
2015W206
// Year: 2015, Week: 20, Day(In week): 0-6 

我认为我面临的问题是ISO-8601周数从周一开始,周日结束,但我试图拉一个从周日开始,周六结束的一周(在日历上显示)。有没有其他方法可以做到这一点?

实际上这是一个预期的结果。

2015-05-17在第20周。

则周天数分别为:(10、11、12、13、14、15、16)和(0、1、2、3、4、5、6)请参阅文档中的本地化符号部分,格式为:

符号ISO年与ISO星期和日:

YY "-"? "W" W "-"? [0-7]

其中最后一个令牌保留一个星期的编号,从星期日到星期六开始。所以当你循环周数时,你得到:

2015W20[0] -> That is, a date on sunday (2015-05-10)
2015W20[1] -> That is, a date on monday (2015-05-18)

所以你必须指定正确的周数:

$days_of_week = array();
$week_number = 21;
$year        = date('Y');
for($day = 0; $day <= 6; $day++)
{
    $format = $year. "W" . $week_number.$day;
    print $format . "'n";
    array_push($days_of_week, date('Y-m-d', strtotime($format)));
}
print_r($days_of_week);

我明白我的问题了。忽略ISO-8601周数(1-53),我能够根据给定日期的周数(周日0 -周六6)获得7天的范围。

$day = new DateTime($date); // 2015-05-21
$start = $day->modify("- ".$day->format("w")." days"); // - 4 days - 2015-05-17
$end = clone $start;
$end = $start->modify("+ 7 days"); // 2015-05-24 (foreach ignores last day)
$interval = new DateInterval("P1D");
$week = new DatePeriod($start, $interval, $end);
foreach($week as $key => $val) {
  $days_of_week[] = date("Y-m-d", strtotime($val->format("Y-m-d")));
}

此方法根据给定日期正确返回一个包含7天的数组,从星期日开始到星期六结束。

感谢@Rizier123的支持。