我必须重写PHP';s之后显式显示DateTimeZone的DateTime


Must I overwrite PHP's DateTime with a DateTimeZone afterwards explicitly?

我收到一个时间:

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)

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

注:

$timezone参数和当$time参数要么是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;dr,我的默认php.ini时区为+2。这不是错的吗?

无论如何,我会用开始时间作为倒计时,所以时区是至关重要的。我的问题是:我将时区改写为UCT正确吗?这会给我提供使用DateTime::diff的正确时间吗?

文档指出,不应将GMT用作DateTimeZone类的有效时区。

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

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

将所有内容保持为UTC是最容易的,否则在不同时区或夏令时生效时运行代码可能会导致无法预见的问题。