虽然@drrcknlsn断言有多种方法可以将时间字符串转换为数据时间是正确的,但重要的是要意识到这些不同的方式不会以相同的方式处理时区。
选项 1 :DateTime('@' . $timestamp)
请考虑以下代码:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
该位消除时区信息,该函数假定 GMT。strtotime
date_create
因此,无论我在哪个服务器上运行它,输出都将如下所示:
2011-12-12T13:17:52+00:00
选项 2 :date_create()->setTimestamp($timestamp)
请考虑以下代码:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
您可能希望这会生成相同的输出。但是,如果我从比利时服务器执行此代码,我会得到以下输出:
2011-12-12T14:17:52+01:00
与该函数不同,该方法假定服务器的时区(在我的情况下是CET),而不是GMT。date_create
setTimestamp
明确设置时区
如果要确保输出与输入的时区匹配,最好显式设置它。
请考虑以下代码:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
现在,还要考虑以下代码:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
因为我们显式设置输出的时区以匹配输入的时区,所以两者都将创建相同的(正确的)输出:
2011-12-12T21:17:52+08:00