如何将 GMT 时区传递给 PHP 日期时间对象


How do I pass GMT timezones to PHP DateTime object?

PHP DateTime对象(更具体地说,DateTimeZone 对象)支持许多时区。这一切都很好,但是有没有办法将 GMT 偏移量作为时区传递?

我知道可以简单地增加或减少小时并应用一些数学,但我想知道是否有一种内置的、健壮的做事方式(或者我是否需要为此制作自己的抽象层)。

TL;DR 如何在 PHP 的 DateTime 或 DateTimeZone 对象中将GMT+N值作为时区传递?

你可以这样做:

$tz = new DateTimeZone('etc/GMT+2');

但是有这样的警告:

请不要使用此处列出的任何时区(UTC 除外),它们仅出于向后兼容的原因而存在。

该列表仅支持整小时。您的某些用户可能居住在未按小时对齐的时区中。另请注意,如果用户通过 UTC 偏移量选择时间,他们将不得不在夏令时/夏令时期间每年更改两次时间。按位置选择消除了这种需求。

您可以

尝试使用 http://php.net/manual/timezones.others.php 中列出的"Etc/GMT??"时区

不幸的是,这些值仅出于"向后兼容的原因"而被标记为",但是如果没有其他方法可以执行此操作,则不妨使用它们。请注意,这些值不包括纽芬兰等某些地区使用的 :30 偏移量,因此稍后会遇到问题。

另一种选择是手动创建一个 array(),将每个时区映射到位于该区域某处的时区名称:

array(
    0 => "UTC",
    1 => "Europe/Paris",
    ...
)

您可以使用DateTime和setTimestamp执行此操作

假设时间格式是这样的Sun, 13 May 2012 01:07:00

$currentDate = new DateTime();
$currentDate->setTimestamp(strtotime( $time.' GMT+0400'));

注意:您必须照顾DST