使用时区偏移量而不是时区标识符将 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 时间转换为本地时间的主要内容,如果未能解决你的问题,请参考以下文章
jdbc PostgreSQL 中的偏移时间(带时区的时间)