虽然@drrcknlsn断言有多种方法可以将时间字符串转换为数据时间是正确的,但重要的是要认识到这些不同的方法不会以相同的方式处理时区。
选项1 :DateTime('@' . $timestamp)
考虑以下代码:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
该strtotime
位消除了时区信息,date_create
函数假定为 GMT ( Europe/Brussels
)。
因此,无论我在哪个服务器上运行,输出都将如下:
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
与date_create
函数不同,该setTimestamp
方法假定服务器的时区('Europe/Brussels'
在我的情况下)而不是 GMT。
明确设置您的时区
如果要确保输出与输入的时区匹配,最好明确设置。
考虑以下代码:
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