2011-06-08 54 views
3

我收到时间:我必须明确地用DateTimeZone重写PHP的DateTime吗?

0001-01-01T00:00:00.000Z 
Greenwich Mean Time 

我在一个DateTime保存为:

$event->startTime = new DateTime($item->startTime, new DateTimeZone('GMT')); 

这给了我:

protected 'startTime' => 
    object(DateTime)[137] 
     public 'date' => string '0001-01-01 00:00:00' (length=19) 
     public 'timezone_type' => int 2 
     public 'timezone' => string 'Z' (length=1) 

这意味着它忽略了时区。从文档:

注:

在$时区参数和 当前时区都将被忽略,当 $时间参数要么是UNIX 时间戳(如@ 946684800)或 指定一个时区(例如 2010-01-28T15:00:00 + 02:00)。

如果我事后重写它:

$event->startTime->setTimezone(new DateTimeZone('GMT')); 

我得到:

protected 'startTime' => 
    object(DateTime)[137] 
     public 'date' => string '0001-01-01 00:00:00' (length=19) 
     public 'timezone_type' => int 3 
     public 'timezone' => string 'UTC' (length=3) 

因此,响应说,时区必须是GMT/UCT是+ 0,但PHP决定TL;博士和我结束了我的默认php.ini时区+2。这不是错的吗?

无论如何,我将使用开始时间作为倒计时,所以时区是至关重要的。我的问题是:我是否将时区覆盖到UCT是正确的?当我打算使用DateTime :: diff时,是否会给我正确的时间?

+0

由于PHP是一种服务器端语言,因此获取Datetime对象总是最终成为服务器端的时间,不是吗? – 2011-06-08 10:10:48

+0

是的,但是我必须坚持DateTime与事件的时区或服务器的时区? – Tjorriemorrie 2011-06-08 10:26:08

回答

0

The documentation表示您不应该使用GMT作为DateTimeZone类的有效时区。

可能会删除Z并指定创建DateTime时的时区,这样构造函数不会忽略时区。

$startTime = new DateTime('0001-01-01T00:00:00.000', new DateTimeZone('UTC')); 

这将是最容易坚持一切为UTC,否则运行代码在不同的时区或当夏令时在影响可能可能导致不可预见的问题。