我认为我完全了解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错误还是我错过了什么?
答案 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
也是正确的
答案 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中添加)