使用时区偏移量而不是时区标识符将 GMT 时间转换为本地时间

Posted

技术标签:

【中文标题】使用时区偏移量而不是时区标识符将 GMT 时间转换为本地时间【英文标题】:Converting GMT time to local time using timezone offset, not timezone identifier 【发布时间】:2012-05-02 05:34:03 【问题描述】:

如果您在 php 中从这个列表中获得了时区标识符,那么将给定的 GMT 日期转换为本地时间非常容易:http://www.php.net/manual/en/timezones.php

例如,您可以这样做(其中 $fromTimeZone 只是“GMT”,$toTimeZone 只是该列表中的常量之一(即“America/Chicago”),而 $datetime 是 GMT 日期):

public static function convertToTimezone($datetime, $fromTimeZone, $toTimeZone, $format = 'Y-m-d H:i')

    // Construct a new DateTime object from the given time, set in the original timezone
    $convertedDateTime = new DateTime($datetime, timezone_open($fromTimeZone));
    // Convert the published date to the new timezone
    $convertedDateTime->setTimezone(timezone_open($toTimeZone));
    // Return the udpated date in the format given
    return $convertedDateTime->format($format);

但是,如果仅给出时区偏移量,我在将相同的 GMT 日期转换为本地时间时遇到问题。例如,我得到的不是“美国/芝加哥”,而是 -0500(这是该时区的等效偏移量)。

我已经尝试过以下方法(其中 $datetime 是我的 GMT 日期,$toTimeZone 是偏移量(在本例中为 -0500)):

date($format, strtotime($datetime . ' ' . $toTimeZone))

我知道所有 date() 类函数都基于服务器的时区。我似乎无法让它忽略这一点并使用明确给出的时区偏移量。

【问题讨论】:

javascript/PHP and timezones的可能重复 你有数字偏移量。为什么不直接加减适当的小时数和分钟数? 【参考方案1】:

您可以将特定偏移量转换为 DateTimeZone:

$offset = '-0500';
$isDST = 1; // Daylight Saving 1 - on, 0 - off
$timezoneName = timezone_name_from_abbr('', intval($offset, 10) * 36, $isDST);
$timezone = new DateTimeZone($timezoneName);

然后你可以在 DateTime 构造函数中使用它,例如

$datetime = new DateTime('2012-04-21 01:13:30', $timezone);

或使用 setter:

$datetime->setTimezone($timezone);

在后一种情况下,如果 $datetime 使用不同的时区构造,则日期/时间将转换为指定的时区。

【讨论】:

以上是关于使用时区偏移量而不是时区标识符将 GMT 时间转换为本地时间的主要内容,如果未能解决你的问题,请参考以下文章

什么控制 WebLogic 中的时区到 GMT 偏移映射?

jdbc PostgreSQL 中的偏移时间(带时区的时间)

GMT 时区转换添加时间差异而不是减去 [重复]

将本地时间转换为用户首选时区,将用户首选时区转换为 GMT

如何将“GMT + 5.5_(INDIA)”转换为时区“Asia / Kolkata”

如何使用 MQ 的 esql 将日期的特定时区转换为 GMT 时区?