PHP时间转换和时区

我正在尝试将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日期后,即使时区相同,也会在那一小时后加上。

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

lcy0851 回答:PHP时间转换和时区

  • $tz变量没有意义,转换完全没有意义。
  • strtotime从字符串本身获取时区(如果它包含时区信息),或者从date_default_timezone_set获取时区(如果字符串不包含时区信息)。您的字符串确实包含时区信息。
  • strftime使用在系统 TZ环境变量中设置的时区。那不是 $tz,它是由您的PHP操作系统“外部”设置的。

因此,该字符串被解析为UTC时间戳,因为它包含一个+00:00时区,然后将其转换为本地TZ所在的任何地方。

如果您想要一个遵循date_default_timezone_set而不是更加晦涩的TZ的PHP日期格式函数,那就应该是date

,

在处理日期时,尝试使用更现代的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

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

本文链接:https://www.f2er.com/3136370.html

大家都在问