DateTime类返回不正确的时区_type和时区



我正在构建一个项目,该项目正在为各种事件创建倒计时,我正试图通过在全球范围内使用UTC来避免错误和问题,使其尽可能与时区无关,这与我现在得到的几乎完全相似。基本流程是:

  1. 将日期/时间输入数据库(存储方式类似于ISO-8601):

    2009-08-07 06:05:04
    

    PHP表示:

    Y-m-d H:i:s
    
  2. datetime数据类型存储在数据库中(它不会尝试将日期时间戳从服务器时区更改为UTC——这不会有用,因为我无论如何都是以UTC输入的)。

  3. 从数据库中检索,并操作成类似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格式。文档在这里。

相关内容

  • 没有找到相关文章

最新更新