2013-03-20 245 views
2

我的服务器和MySQL数据库的默认时区设置为GMT。我的PHP代码转换成显示给用户的本地时区(东部在这种情况下)日期:PHP时区转换/ 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输出:3月20日,2013 5:05 PM GMT

实际时间显示正确,但日期输出中的'T'仍然显示GMT。有没有办法让它显示我们已经转换的时区,而不是GMT的默认值。我知道这样做的唯一方法是每次使用date_default_timezone_set切换到用户的时区,然后切换回GMT。但我觉得必须有更高效的方式...

谢谢!

+3

你为什么要以格式输出日期,只能用strtotime转身再做同样的事情?只需使用一次'$ OPENED_DATE-> format('F j,Y g:i A T')' – 2013-03-20 22:56:35

回答

1

这两条线是冗余

$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对象来格式化日期即可满足您的需求。

+0

具有完美的感觉并且像魅力一样工作 - 谢谢!必须等待10分钟,但将标记为答案! – Jason 2013-03-20 23:00:18

1

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

您仅将$OPENED_DATE中的年/月/日/小时/分钟/部分传递给strtotime(),因此无法获取时区信息。

现在,你可能设置用于像strtotime()date()功能,以及默认的时区,使用date_default_timezone_set()

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

日期时间的对象将让你直接格式化时间输出:

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

因此完全跳过strtotime()date()步骤。

+0

谢谢!对此,我真的非常感激! – Jason 2013-03-20 23:04:46