2

我的服务器和 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 的输出:格林威治标准时间 2013 年 3 月 20 日下午 5:05

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

谢谢!

4

2 回答 2

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

于 2013-03-20T22:58:58.190 回答
1

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

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

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

但是,这仍然很麻烦,您不需要这样做,因为已经有一个 DateTime 对象,您不妨继续使用它。

DateTime 对象将让您直接输出格式化的时间:

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

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

于 2013-03-20T23:00:07.993 回答