【问题标题】:PHP date problemPHP日期问题
【发布时间】:2010-07-06 04:37:22
【问题描述】:

我在 PHP 中有 Web 服务,它获取 dateTime 对象(来自 asp)。我想以我的自定义格式解析这个日期。日期最初的格式是 "2010-07-05T00:00:00+02:00" 。当我尝试这个时:

$oDate = strtotime($date_from_webservice);
$sDate = date("d.m.Y",$oDate);
echo $sDate;

我得到的日期是“07.04.2010”,它早一天。为什么?

谢谢

【问题讨论】:

    标签: php datetime date strtotime


    【解决方案1】:

    看了一下,原来的日期($date_from_webservice)在时区GMT+2,时间是午夜。

    我猜 PHP 配置的时区不同(可能是 UTC),所以日期“似乎”是前一天。但是,转换是完全正确的。

    要解决此问题,您有几个选择:

    1. 要求/告诉源服务器以 UTC 形式返回日期时间(这才是它真正应该做的),确保 PHP 也使用 UTC。

    2. 使用date_default_timezone_set 或在php.ini 中将PHP 配置为与源服务器相同的时区。请注意,由于夏令时,您不能只加/减小时。

    3. 如果您确定日期时间格式一致,请使用substr。例如:

      $sDate=substr($oDate, 8, 2).'.'.substr($oDate, 5, 2).'.'.substr($oDate, 0 ,4);

    选项 1 是最好的。如果源服务器更改了时区,则选项 2 是有风险的。选项 3 假定日期时间格式永远不会改变。

    【讨论】:

    • 为什么源服务器应该将日期时间返回为UTC?您认为时区通常无关紧要吗?
    • 如果您将日期时间作为 Web 服务提供,出于非常明显的原因,最好使用 UTC,在示例中,源服务器应该输出 2010-07-04T22:00:00+00:00。我从来没有说过时区无关紧要......
    【解决方案2】:

    因为您的时区偏移量小于 +2 小时。假设您在里斯本,当前时区偏移为 UTC + 1 小时。那么那个时间就是“2010-07-04T23:00:00+01:00”,也就是前一天。

    您可以改用DateTime

    $date = new DateTime("2010-07-05T00:00:00+02:00");
    echo $date->format("d.m.Y"); //echoes 05.07.2010
    

    这会自动将时区“+02:00”与日期相关联,确保格式正确。

    另一方面:

    $date = new DateTime("2010-07-05T00:00:00+02:00");
    $date->setTimeZone(new DateTimezone("Europe/Lisbon"));
    echo $date->format("d.m.Y"); //echoes 04.07.2010
    

    【讨论】:

      【解决方案3】:

      PHP 在格式化date 字符串时使用(邪恶的)全球时区。您可以通过调用date_default_timezone_set 来使用$oDate 的时区:

      $oDate = strtotime($date_from_webservice);
      
      $oldTimezone = date_default_timezone_get();
      date_default_timezone_set(date('e', $oDate));
      
      $sDate = date('d.m.Y', $oDate);
      
      date_default_timezone_set($oldTimezone);
      
      echo $sDate;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多