PHP中缺少一周的DateTime->修改('下周')

时间:2016-07-07 12:32:45

标签: php datetime week-number

我认为我完全了解ISO 8601,并且一年的第一周是周一的一周。但是我在PHP(5.6)DateTime Class中遇到了一个奇怪的行为。

这是我的代码:

$start = new DateTime('2009-01-01 00:00');
$end = new DateTime();
$point = $start;

while($point <= $end){
   echo $point->format('YW');
   $point = $point->modify('next week');
}

这是正确的

200901
200902
200903
...

但是,如果我选择2008年早些时候的某个开始日期,例如$start = new DateTime('2008-01-01 00:00');,那么我会得到不同的结果:

...
200852
200801 // <=== 2008??
200902   
200903
...

这是一个PHP错误还是我错过了什么?

2 个答案:

答案 0 :(得分:4)

对此进行修补并最终弄清楚

$start = new DateTime('2008-12-29 00:00');
$end = new DateTime('2009-01-7 00:00');
$point = $start;

while($point <= $end){
   echo $point->format('YW') . "\t";
   echo $point->format('m-d-Y')  . "\n";
   $point = $point->modify('next week');
}

所以这里的第一个日期是2008-12-29。因此Y是正确的。但2008-12-29第1周。所以W也是正确的

https://3v4l.org/JZtqa

答案 1 :(得分:0)

这不是一个错误!受@Machavity启发并基于此this similar question我找到了一个解决方案:

echo $point->format('oW');

而不是

echo $point->format('YW')

产生

...
200852
200901
200902
...

无论开始日期是什么时候。它真的是一个RTM案例,正如PHP手册所述:

  

o ==&gt;   ISO-8601年份编号。这与Y具有相同的值,除非是   ISO周数(W)属于上一年或明年,那一年是   用来代替。 (在PHP 5.1.0中添加)