2012-05-12 43 views
2

PHP DateTime对象(更具体地说是DateTimeZone对象),supports many time zones。这一切都很好,但是有没有办法将GMT偏移作为时区传递?如何将GMT时区传递给PHP DateTime对象?

我知道可以简单地加上或减去小时并应用一些数学运算,但是我想知道是否有内置的,可靠的做事方式(或者我是否需要为此创建自己的抽象层) 。

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

+0

的护理是很好,如果你可以像欧洲/巴黎添加的东西如时区? – Dhiraj

+1

@DhirajBodicherla:不,重点是用户应该选择他的GMT时间,而不是位置时间。我不想做一些奇怪的映射。 –

+0

会有DST的好处,但如果你不需要它,我想它的矫枉过正;-) – alexander255

回答

2

你可以这样做:

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

但是有这样的警告:

,请不要使用任何这里(除了UTC)中列出的时区,他们只存在向后兼容的原因。

该列表只支持整个小时。您的某些用户可能生活在未按小时排列的时区中。另请注意,如果用户通过UTC偏移量选择时间,则在夏令时/夏令时期间,他们将不得不每年更换两次。按地点选择消除了这种需求。

+0

谢谢你的回答!我的代码不应该显示实际的时间,并且DST也被考虑在内。所以我对这个很满意。谢谢! –

1

你可以尝试使用“Etc/GMT ??”在http://php.net/manual/timezones.others.php

上列出的时区只能将这些值标记为“向后兼容的原因”,但如果没有其他方法可以使用它们,则可以使用它们。请注意,这些值不包括:纽芬兰等一些地区使用的30个抵消额,所以稍后您会遇到问题。

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

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

2分钟太晚了,但您的答案是有效的。由于我实际上没有显示实际时间(很复杂),所以很酷。我不知道:30偏移量,我也会考虑这些。谢谢! –

0

为此,您可以使用DateTime和的setTimestamp

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

$currentDate = new DateTime(); 

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

注意:你将不得不采取DST

+0

看起来很讨厌...我使用'DateTime()'的目的是为了避免需要'strtotime'或'mkdate'或任何其他讨厌的函数!还是)感谢你的建议! –