PHP时区转换/ PHP日期没有显示正确的时区


PHP Timezone Conversion / PHP Date not displaying correct timezone

我的服务器和MySQL数据库的默认时区设置为GMT。我的PHP代码将显示的日期转换为用户的本地时区(在本例中为东部):

$OPENED_DATE = '2013-03-20 21:05:00'
$OPENED_DATE = new DateTime($OPENED_DATE);
$OPENED_DATE->setTimeZone(new DateTimeZone('America/New_York'));

然后输出用户的日期:

$OPENED_DATE = strtotime($OPENED_DATE->format('Y-m-d H:i:s'));      
$OPENED_DATE = date('F j, Y g:i A T', $OPENED_DATE);

$OPENED_DATE的输出:March 20,2013 5:05PM GMT

实际时间显示正确,但日期输出中的'T'仍然显示GMT。有没有办法让它显示我们转换到的时区,而不是默认的GMT ?我知道要做到这一点的唯一方法是每次使用date_default_timezone_set切换到用户的时区,然后切换回GMT。但我觉得应该有更有效的方法……

谢谢!

这两行是多余的

$OPENED_DATE = strtotime($OPENED_DATE->format('Y-m-d H:i:s'));      
$OPENED_DATE = date('F j, Y g:i A T', $OPENED_DATE);

这是对date()的调用,输出错误的时区。

为什么不试试:

$OPENED_DATE = $OPENED_DATE->format('F j, Y g:i A T');

DateTime对象在其中设置了时区,但是一旦将其转换为时间戳并使用date(),服务器时区将用于该时间。我认为只要使用DateTime对象来格式化日期就足够了。

由于您仅对$OPENED_DATE变量应用了时区设置,因此strtotime()date()函数不会接收到相同的时区信息。

您只将年/月/日/小时/分钟/部分从$OPENED_DATE传递到strtotime(),因此它无法获得时区信息。

现在,您可以做的是设置用于strtotime()date()等函数的默认时区,以及使用date_default_timezone_set()

然而,这仍然是麻烦的,你不需要这样做,因为已经有了一个DateTime对象,你也可以继续使用它。

DateTime对象可以让你直接输出一个格式化的时间:

$OPENED_DATE->format('F j, Y g:i A T');

从而完全跳过strtotime()date()步骤。