DateTimeZone 只处理一个方向的偏移量

DateTimeZone only handles offsets in one direction

我正在尝试检索不在 GMT 中的日期并将其转换为 GMT。为此,我创建了两个时区(一个 GMT 和一个非 GMT)并尝试获取它们之间的时差。然而,偏移仅在一个方向上是正确的。对于这个具体示例,我试图将 GMT +4 与 GMT 进行比较。当我将 GMT 时区与 GMT+4 时区进行比较时,我希望得到 4 小时(14400 秒),而当我将 GMT+4 时区与 GMT 进行比较时,我希望得到 -4 小时(-14400 秒)。但是,当比较后者时,我得到 0...这就是我所拥有的

$default_timezone = new DateTimeZone(drupal_get_user_timezone());
$default_reg_date = new DateTime($reg_date_string, $default_timezone);

$gmt_timezone = new DateTimeZone('UTC');
$gmt_reg_date = new DateTime($reg_date_string, $gmt_timezone);

// Returns as 14400
$default_gmt_offset = $default_timezone->getOffset($gmt_reg_date);

// Returns as 0
$gmt_default_offset = $gmt_timezone->getOffset($default_reg_date); 

为什么我不能得到正确的号码,我做错了什么?检索偏移量是否只能以一种方式工作?

注意:在此特定示例中,drupal_get_user_timezone() 返回 GMT+4

来自PHP documentation :

This function returns the offset to GMT for the date/time specified in the datetime parameter. The GMT offset is calculated with the timezone information contained in the DateTimeZone object being used.

该函数使用 2 个逻辑步骤:

  1. 将日期转换为应用该函数的时区
  2. 获取与 GMT 的时差

因此在 new DateTimeZone('UTC') 上调用此函数将始终 returns 0

如果要将日期转换为 UTC,可以使用 setTimeZone 函数:

$date_string = '2020-05-01 09:11:00' ;
$date = new DateTime($date_string, new DateTimeZone('Europe/Brussels'));
echo $date->format('c') ; // 2020-05-01T09:11:00+02:00

$date->setTimeZone(new DateTimeZone('UTC'));
echo $date->format('c') ; // 2020-05-01T07:11:00+00:00