我正在构建一个为各种事件创建倒计时的项目,我试图通过全局使用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?
我很难理解这是否会影响这些数据构建的倒计时,但这似乎并没有改变它,但它确实令人沮丧和意外。有人有任何理由吗?
答案 0 :(得分:3)
至于为什么会发生这种情况:您的PHP安装可能有欧洲/柏林set as its default time zone。
无论哪种方式,createFromFormat
作为您应该能够使用的timezone
参数:
...createFromFormat('Y-m-d H:i:s', $inputDateTime, new DateTimeZone("UTC"));
应该这样做。
答案 1 :(得分:1)
您需要在php.ini
至UTC
中设置date.timezone
,或使用date_default_timezone_set()
在应用中设置here。
+0100来自您选择的RFC2822格式。文档为{{3}}。