Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中缺少一周';s日期时间->;修改(';下周';)_Php_Datetime_Week Number - Fatal编程技术网

PHP中缺少一周';s日期时间->;修改(';下周';)

PHP中缺少一周';s日期时间->;修改(';下周';),php,datetime,week-number,Php,Datetime,Week Number,我想我完全了解ISO 8601,一年中的第一周是有星期一的一周。然而,我在PHP(5.6)DateTime类中遇到了一个奇怪的行为 这是我的密码: $start = new DateTime('2009-01-01 00:00'); $end = new DateTime(); $point = $start; while($point <= $end){ echo $point->format('YW'); $point = $point->modify('ne

我想我完全了解ISO 8601,一年中的第一周是有星期一的一周。然而,我在PHP(5.6)DateTime类中遇到了一个奇怪的行为

这是我的密码:

$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');
}
但是如果我选择2008年早些时候的某个日期作为开始日期,比如
$start=newdatetime('2008-01-01 00:00')然后我得到一个不同的结果:

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

200801/对此进行了修补并最终找到了答案

$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');
}
$start=newdatetime('2008-12-29 00:00');
$end=新日期时间('2009-01-7 00:00');
$point=$start;
而($point format('YW')。“\t”;
echo$point->format('m-d-Y')。“\n”;
$point=$point->modify('nextweek');
}
因此,这里的第一个日期是
2008-12-29
。因此
Y
是正确的。但是
2008-12-29
也是第一周。因此
W
也是正确的


这不是一个bug!灵感来自@Machavity,基于此,我找到了一个解决方案:

echo $point->format('oW');
而不是

echo $point->format('YW')
产生:

...
200852
200901
200902
...
无论开始日期是什么时候。这实际上是一个RTM案例,正如PHP手册所述:

o==> ISO-8601年编号。该值与Y值相同,只是 ISO周数(W)属于上一年或下一年,即 改为使用。(在PHP5.1.0中添加)


这是因为它是2009年的第一周,请尝试
echo$point->format('YW')。“-->”“$point->format('Y-m-d'))
希望你能理解这是一个PHP错误。如果你一年一周地迭代,你会希望它能正确计算第53周,对吧?@StevenM这不是错误。ISO8601就是这样看待它的。你会注意到,
2008年12月29日周一
2009-W01-1
是的,没错,但PHP让它成为f2008年的第一周不是2009年。@StevenM No.12-29-2008仍在2008年。这就是
Y
所做的。如果您使用
o
(ISO8601年),您将看到它是在2009年。错误在您的脚本中,而不是在PHP中
...
200852
200901
200902
...