虽然@drrcknlsn是正确的断言,有多种方式的时间字符串转换为DATATIME,必须认识到这些不同的方式不处理以同样的方式时区是很重要的。
选项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