2009-12-10 231 views
0

strtotime('2010年1月3日')在GMT + 5:30返回1230993600。PHP strtotime返回错误结果

虽然根据this,unix时间戳1230993600是1月3日,。所以它关闭了一年。

它发生在PHP 5.2.6以及5.2.11上。

+0

PHP 5.2.10-2ubuntu6.3上的WFM: 'echo strtotime('3rd 3rd,2010');'returns'1231009800' – 2009-12-10 22:29:41

+0

其实,根据那个网站,unix时间戳1230993600是01/03/09 @上午8点40分。 – 2009-12-10 22:30:44

回答

2

问题是日期字符串中的,。这似乎是分开在字符串中的时间元素日期,

echo date('Y-m-d H:i:s', strtotime('3rd January, 2010')); 

回报

2009-01-03 20:10:00 

echo date('Y-m-d H:i:s', strtotime('3rd January 2010')); 

,删除)返回正确日期:

2010-01-03 00:00:00 
3

W如果你在这个月之后有一个逗号,它假定2010年是军事时间而不是年份。如果您希望它将2010年解释为年份,请省略逗号。

1

strtotime()是不可靠的。它是一种上下文解析器,它试图将日期的英文描述转换为时间戳。您使用的格式似乎不适合正确解析。

你可以看到差异将在下面的例子:

echo strtotime('3rd January,2010')."<BR>"; 
echo strtotime('3 January, 2010')."<BR>"; 
echo strtotime('January 3rd, 2010')."<BR>"; 
echo strtotime('January 3, 2010')."<BR>"; 

结果:

1231042200 
1231042200 
1262505600 
1262505600 

前两回不同的时间戳比最后两位。在这两种格式中,后两种语义(英语方面)更正确,我会尝试使用它们。

编辑

正如其他海报指出,逗号混淆了日期部分解析器因您的日期标记的顺序。

echo strtotime('3rd January 2010')."<BR>"; 

为您的格式返回正确的时间戳。

+0

非常好的答案。只是添加一些信息:当strtotime()未能解析年份时,它使用当前年份(即2009年),就像它没有被指定一样。 – Savageman 2009-12-10 22:35:29

+0

但为什么它与2009年一起工作?此外,第一种格式是完全有效的格式。 – understack 2009-12-10 22:36:09

+0

好的,Savageman回答。 – understack 2009-12-10 22:36:43