我有以下代码:
var_dump(new DateTime('now', new DateTimeZone('GMT')));
我得到以下输出,落后一小时:
object(DateTime)#894 (3) { ["date"]=> string(19) "2012-09-13 13:54:26" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "UTC" }
但是,如果我将代码更改为以下内容:
var_dump(new DateTime('now', new DateTimeZone(date_default_timezone_get())));
然后我得到正确的输出:
object(DateTime)#894 (3) { ["date"]=> string(19) "2012-09-13 14:54:26" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/London" }
我在 Derick Rethans 博客上读到,对于时区 3,它应该考虑到任何夏令时,谁能解释为什么在第一个代码片段上我比它实际是什么早一小时?!
好吧,在第一个片段中,您要求时区为"GMT"。这是一个有点模棱两可的术语,但我通常认为这完全意味着格林威治标准时间本身 - 大致相当于UTC,并且没有任何夏令时。这就是为什么它不应用夏令时,而是将时区报告为 UTC。
欧洲/伦敦时区一年中有一半时间在格林威治标准时间,半年时间在英国夏令时。
我建议您尽可能避免使用3个字母的时区缩写。它们充满了各种失败的可能性。(现在阅读了博客文章,这基本上也是那里的建议。