2011-09-02 44 views
5

考虑以下字符串日期:Fri Sep 02 2011 21:00:00 GMT+0100 (GMT Daylight Time)的strtotime日期怪异的结果

在PHP,如果我做以上一个的strtotime,然后将其转换回字符串日期,它似乎获得一个小时。

echo $str_date," Vs ",date("c",strtotime($str_date)); 

产地:

Fri Sep 02 2011 21:00:00 GMT+0100 (GMT Daylight Time) Vs的2011-09-02T22:00:00+01:00

我意识到这是日光节约做,但如何弥补这一?

回答

1

我意识到这是与夏令时,但如何补偿呢?

通过不使用date()strtotime();所述DateTime类是优选的。

$str_date = 'Fri Sep 02 2011 21:00:00 GMT+0100'; 
$datetime = new DateTime($str_date); 
echo $datetime->format('c'); // 2011-09-02T21:00:00+01:00 

或程序风格

$str_date = 'Fri Sep 02 2011 21:00:00 GMT+0100'; 
echo date_format(date_create($str_date), 'c'); // 2011-09-02T21:00:00+01:00 

旁白:如果你希望仍然使用date()/strtotime()那么,作为其他的答案和你自己的观测表明,你需要小心在日期字符串,是你的脚本中使用的时区。

+0

这将产生预期的结果,谢谢。 –

3

我想你误会,
没有日光节约在这种情况下,
GMT,你获得,因为在我的时区是

一个小时(GMT + 8)

php -r "echo date('r', strtotime('Fri Sep 02 2011 21:00:00 GMT+0100'));" 
Sat, 03 Sep 2011 04:00:00 +0800 

我得到7小时,因为GMT+8 - GMT+1 = 7

1

你使用哪个PHP版本?什么是你的date.timezone设置?我问,因为我不能重现你的输出在Mac OS X上运行PHP 5.3.6:

$str_date = 'Fri Sep 02 2011 21:00:00 GMT+0100 (GMT Daylight Time)'; 
echo $str_date," Vs ",date("c",strtotime($str_date)); 
// Fri Sep 02 2011 21:00:00 GMT+0100 (GMT Daylight Time) Vs 1970-01-01T01:00:00+01:00 

这是正确的,因为Fri Sep 02 2011 21:00:00 GMT+0100 (GMT Daylight Time)是不是有效的日期/时间字符串。

$str_date = 'Fri Sep 02 2011 21:00:00 GMT+0100'; 
echo $str_date," Vs ",date("c",strtotime($str_date)); 
// Fri Sep 02 2011 21:00:00 GMT+0100 Vs 2011-09-02T22:00:00+02:00 

这是正确的,因为我在GMT + 2。

+0

烨,'(GMT夏令时)'是多余的 – ajreal

0

好像strtotime()呈现你的时间为SOAP格式:YY "-" MM "-" DD "T" HH ":" II ":" SS frac tzcorrection?

结果是:

"2008-07-01T22:35:17.02", "2008-07-01T22:35:17.03+08:00" 

你可以试试你的时间字符串格式一些其他时间格式。看在http://www.php.net/manual/en/datetime.formats.compound.php