【问题标题】:DateTimeZone only handles offsets in one directionDateTimeZone 只处理一个方向的偏移量
【发布时间】:2020-08-15 11:12:50
【问题描述】:

我正在尝试检索不在 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 datetime timezone utc


    【解决方案1】:

    来自PHP documentation

    此函数返回 与 GMT 的偏移量,用于 datetime 参数中指定的日期/时间。 GMT 偏移量是使用包含在所使用的 DateTimeZone 对象中的时区信息计算的。

    该功能有 2 个逻辑步骤:

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

    所以在new DateTimeZone('UTC')上调用这个函数总是会返回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
    

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      相关资源
      最近更新 更多