在PHP中解析带有时区的datetime字符串

在PHP中解析带有时区的datetime字符串,php,timezone,Php,Timezone,我有一个如下格式的字符串:2013-07-31T19:20:30.45-07:00,我想对它进行解析,这样我就可以,例如,说出一周中的哪一天。但我正在努力应对时区偏移。如果我做了date\u parse(“2013-07-31T19:20:30.45-07:00”)那么我会得到这样的结果: array(15) { ["year"]=> int(2013) ["month"]=> int(7) ["day"]=> int(31) ["hour"]=> int

我有一个如下格式的字符串:
2013-07-31T19:20:30.45-07:00
,我想对它进行解析,这样我就可以,例如,说出一周中的哪一天。但我正在努力应对时区偏移。如果我做了
date\u 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\u default\u timezone\u set('UTC')
设置了默认时区

更新:如果字符串的时区为正,例如
2013-07-31T19:20:30.45+07:00
,则
date\u parse()输出的最后一部分为:

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

420在几分钟内就是区域

420/60=7

我想对它进行解析,这样我就可以,例如,说一天的哪一天 现在是星期

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

$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\u name\u from\u 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);

420在几分钟内就是区域

420/60=7

我想对它进行解析,这样我就可以,例如,说一天的哪一天 现在是星期

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

$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\u name\u from\u 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);
我猜时区距离UTC大约7小时

请记住,有些国家有半小时时区,甚至分钟时区。这可能就是为什么你能在几分钟内得到时区

我猜时区距离UTC大约7小时


请记住,有些国家有半小时时区,甚至分钟时区。这可能就是为什么你可以在分钟内得到时区。

我甚至都没有记下时区可能是分钟!我添加了一个正时区的示例。。。在我看来,
区域
与我期望的正好相反…?好吧,在这种情况下,您可以忽略区域类型字段。时区偏移可以是15、30或60分钟。太好了,谢谢!我已经很久没有做过很多PHP了,上一次做PHP的时候,我基本上避开了时区。我甚至都没注意到时区可能是几分钟!我添加了一个正时区的示例。。。在我看来,
区域
与我期望的正好相反…?好吧,在这种情况下,您可以忽略区域类型字段。时区偏移可以是15、30或60分钟。太好了,谢谢!我已经很久没有做过很多PHP了,上一次做PHP的时候我基本上避开了时区。谢谢-我甚至没有意识到
420
是几分钟!谢谢-我甚至没有意识到
420
是几分钟!