DateTime类返回错误的timezone_type和timezone?

时间:2013-12-26 02:23:49

标签: php timezone

我正在构建一个为各种事件创建倒计时的项目,我试图通过全局使用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
    
  4. 所有这些都像我说的那样在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?

    我很难理解这是否会影响这些数据构建的倒计时,但这似乎并没有改变它,但它确实令人沮丧和意外。有人有任何理由吗?

2 个答案:

答案 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.iniUTC中设置date.timezone,或使用date_default_timezone_set()在应用中设置here

+0100来自您选择的RFC2822格式。文档为{{3}}。