1

我有一个这种格式的字符串: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)
}
4

2 回答 2

1

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

420/60 = 7

我想解析它,例如,我可以说出它是星期几。

如果您想知道星期几,您有很多选择。例如,您可以使用日期和 mktime 函数:

$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);
于 2013-08-05T11:05:12.967 回答
0
2013-07-31T19:20:30.45-07:00
^ y-m-d    ^ time      ^ timezone offset

我猜时区-7 hours来自UTC。

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

于 2013-08-05T11:11:51.813 回答