在PHP中解析带有时区的日期时间字符串

时间:2013-08-05 10:59:56

标签: php timezone

我有一个这种格式的字符串:2013-07-31T19:20:30.45-07:00我要解析它,以便我可以,例如,说出它是星期几。但我正在努力应对时区偏移。如果我做date_parse("2013-07-31T19:20:30.45-07:00")那么我最终会得到这样的结果:

array(15) {
  ["year"]=> int(2013)
  ["month"]=> int(7)
  ["day"]=> int(31)
  ["hour"]=> int(19)
  ["minute"]=> int(20)
  ["second"]=> int(30)
  ["fraction"]=> float(0.45)
  ["warning_count"]=> int(0)
  ["warnings"]=> array(0) { }
  ["error_count"]=> int(0)
  ["errors"]=> array(0) { }
  ["is_localtime"]=> bool(true)
  ["zone_type"]=> int(1)
  ["zone"]=> int(420)
  ["is_dst"]=> bool(false)
}

这与时区有关,但如果我想要显示有关时区的信息,我该如何处理420

如果重要,我之前使用date_default_timezone_set('UTC')设置了默认时区。

更新:如果字符串有一个正时区,例如2013-07-31T19:20:30.45+07:00,那么date_parse()输出的最后一部分是:

  ["is_localtime"]=> bool(true)
  ["zone_type"]=> int(1)
  ["zone"]=> int(-420)
  ["is_dst"]=> bool(false)
}

2 个答案:

答案 0 :(得分:1)

420是以分钟为单位的区域。

  

420/60 = 7

     

我想解析它,以便我可以,例如,说出哪一天   这一周。

如果您想知道一周的哪一天,您有很多选择。例如,您可以使用date和mktime-functions:

$parsed = date_parse("2013-07-31T19:20:30.45-07:00");
$unix_timestamp = mktime($parsed['hour'], 0, 0, $parsed['month'], $parsed['day'], $parsed['year'], (int)$parsed['is_dst']);

echo date('l', $unix_timestamp);

所以你想显示有关时区的信息?您可以使用timezone_name_from_abbr功能获取时区名称:

$name = timezone_name_from_abbr("", -1*$parsed['zone']*60, false); // NB: Offset in seconds! 
var_dump($name);

$timezone = new DateTimezone($name); 
var_dump($timezone);

答案 1 :(得分:0)

2013-07-31T19:20:30.45-07:00
^ y-m-d    ^ time      ^ timezone offset

我猜测UTC的时区是-7 hours

请记住,有些国家/地区有半小时的时区,甚至是小时区。这可能就是你在几分钟内得到时区的原因。

相关问题