如何将 GMT 时区传递给 PHP DateTime 对象?

How do I pass GMT timezones to PHP DateTime object?

提问人:Madara's Ghost 提问时间:5/13/2012 更新时间:5/13/2012 访问量:364

问:

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

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

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

PHP 日期时

评论

0赞 Dhiraj 5/13/2012
如果可以添加欧洲/巴黎之类的时区,可以吗?
1赞 Madara's Ghost 5/13/2012
@DhirajBodicherla:不,关键是用户应该选择他的 GMT 时间,而不是位置时间。而且我不想做一些奇怪的映射。
0赞 ntninja 5/13/2012
本来可以享受夏令时的好处,但如果你不需要,我想它有点矫枉过正;-)
0赞 hakre 5/13/2012
只有一个 GMT 时区(不是多个)。您可能指的是 GMT 偏移量,这些偏移量因时区和时间而异。那么,除了“你想知道的”之外,结果应该有什么用呢?

答:

2赞 Matthew 5/13/2012 #1

您可以这样做:

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

但是有这样的警告:

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

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

评论

0赞 Madara's Ghost 5/13/2012
谢谢你的回答!我的代码不应该显示实际时间,并且还考虑了 DST。所以我对这个很满意。谢谢!
1赞 ntninja 5/13/2012 #2

您可以尝试使用 http://php.net/manual/timezones.others.php 中列出的“Etc/GMT??”时区

不幸的是,这些值仅被标记为“向后兼容原因”,但如果没有任何其他方法可以做到这一点,您也可以使用它们。请注意,这些值不包括某些地区(如纽芬兰)使用的 :30 偏移量,因此您稍后会遇到问题。

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

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

评论

0赞 Madara's Ghost 5/13/2012
晚了 2 分钟,但您的答案是有效的。由于我实际上没有显示实际时间(这很复杂),所以很酷。我不知道 :30 偏移量,我也会考虑这些。谢谢!
0赞 Dhiraj 5/13/2012 #3

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

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

$currentDate = new DateTime();

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

注意:您必须注意夏令时

评论

0赞 Madara's Ghost 5/13/2012
看起来很骇人听闻......我使用的目的是避免需要或任何其他令人讨厌的功能!谢谢你的建议!DateTime()strtotimemkdate