我正在构建一个项目,该项目正在为各种事件创建倒计时,我正试图通过在全球范围内使用UTC来避免错误和问题,使其尽可能与时区无关,这与我现在得到的几乎完全相似。基本流程是:
-
将日期/时间输入数据库(存储方式类似于ISO-8601):
2009-08-07 06:05:04
PHP表示:
Y-m-d H:i:s
-
以
datetime
数据类型存储在数据库中(它不会尝试将日期时间戳从服务器时区更改为UTC——这不会有用,因为我无论如何都是以UTC输入的)。 -
从数据库中检索,并操作成类似RFC-2822-的格式(我这样做是因为日期/时间会插入Javascript倒计时,Safari只接受这种特定的日期/时间格式,这已经够烦人的了):
07 Aug 2009 06:05:04
PHP表示:
d M Y H:i:s
正如我所说,所有这些都是在UTC中完成的,以避免在开始添加时区时出现问题。
我遇到的问题似乎发生在第3步或前后,即日期时间被重新格式化。以下是我的PHP函数:
function manipulateDateTime($inputDateTime, $utc_visible = true) {
$temp = DateTime::createFromFormat('Y-m-d H:i:s', $inputDateTime);
$outputDateTime = $temp->format('d M Y H:i:s');
if ($utc_visible === true) {
return $outputDateTime.' UTC';
} else {
return $outputDateTime;
}
}
然后我发现DateTime
类有一个名为DateTime::RFC2822
的常量,Safari实际上接受了这个常量。。。很酷,我可以从第3行删除我的PHP格式,替换为:
$outputDateTime = $temp->format('d M Y H:i:s');
这个:
$outputDateTime = $temp->format(DateTime::RFC2822);
但当我这样做时,$outputDateTime
等于Fri, 03 Jan 2014 22:57:00 +0100
。
额外的+0100是从哪里来的
我决定打印$temp
,我的DateTime
对象:
DateTime Object ( [date] => 2014-01-03 22:57:00 [timezone_type] => 3 [timezone] => Europe/Berlin )
为什么我看到的是"欧洲/柏林"而不是"UTC">
A) 我根本不在欧洲/柏林,我在新西兰(UTC+13,如果这很重要的话),B)为什么不自动格式化为UTC?
我很难理解这是否会影响基于这些数据的倒计时,这似乎不会改变它,但这确实令人沮丧和意外。有人对此有什么原因吗?
至于发生这种情况的原因:您的PHP安装可能将欧洲/柏林设置为默认时区。
不管怎样,createFromFormat
作为timezone
参数,您应该能够使用:
...createFromFormat('Y-m-d H:i:s', $inputDateTime, new DateTimeZone("UTC"));
应该做到这一点。
您需要将php.ini
中的date.timezone
设置为UTC
,或者使用date_default_timezone_set()
在应用程序中进行设置。
+0100来自您选择的RFC2822格式。文档在这里。