【问题标题】:PHP Time Conversion and TimezonesPHP 时间转换和时区
【发布时间】:2020-03-05 07:50:11
【问题描述】:

我正在尝试将 RSS 日期 (ISO 8601) 转换为 iCalendar 日期。我想我会将初始日期时间转换为 Unix 时间戳,然后将其格式化为 strftime

我了解strftime 将日期时间更改为当地时间。

我正在从配置为欧洲/苏黎世时区的 Wordpress RSS 提要中获取初始 $date 值。从 RSS 获取的日期是正确的(从 11 月 15 日上午 8 点开始)。

当我转换它时,它会得到一个额外的小时。

我必须设置date_default_timezone_set('UTC') 以保持时间不变。

$tz = "Europe/Zurich";
//date_default_timezone_set('UTC'); //not Europe/Zurich
$date = "2019-11-15T08:00:00+00:00";
$dt = strftime("%Y%m%dT%H%M%S", strtotime($date));

echo $date . "\r\n";
echo strtotime($date) . "\r\n";
echo $dt . "\r\n";
  • 2019-11-15T08:00:00+00:00
  • 20191115T090000

我对使用时区感到非常困惑...... 苏黎世的初始值是早上 8 点,但是当转换为 iCalendar 日期时,即使时区相同,也会增加一小时。

处理这个问题的最佳方法是什么?

【问题讨论】:

    标签: php date timezone


    【解决方案1】:

    在处理日期时尝试使用更现代的 DateTime 类:

    $date = "2019-11-15T08:00:00+00:00";
    $dtobj = new \DateTime($date);
    
    var_dump($dtobj);
    echo date_default_timezone_get();
    echo "\n";
    echo $dtobj->format("Ymd\This");
    

    在我的系统上,这会导致:

    class DateTime#1 (3) {
      public $date =>
      string(26) "2019-11-15 08:00:00.000000"
      public $timezone_type =>
      int(1)
      public $timezone =>
      string(6) "+00:00"
    }
    America/Toronto
    20191115T080000
    

    如您所见,该对象将时区存储为属性,因此系统上的时区不再相关。

    【讨论】:

      【解决方案2】:
      • $tz 变量没有任何意义,因为对转换没有任何意义。
      • strtotime 如果包含时区信息,则从字符串本身获取时区,如果字符串不包含时区信息,则从 date_default_timezone_set 获取时区。您的字符串确实包含时区信息。
      • strftime 使用系统的TZ 环境变量 中设置的时区。那是不是$tz,它是由你的操作系统在PHP“外部”设置的。

      因此,字符串被解析为 UTC 时间戳,因为它包含 +00:00 时区,然后转换为您本地的 TZ

      如果您想要一个遵循 date_default_timezone_set 而不是更模糊的 TZ 的 PHP 日期格式化函数,那就是 date

      【讨论】:

      • 抱歉,$tz 是我试图用 DateTime 设置时区的剩余部分...
      猜你喜欢
      • 2011-12-15
      • 2016-07-06
      • 2011-07-27
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 2016-11-06
      相关资源
      最近更新 更多