繁体   English   中英

DateTime::getTimezone 不返回时区名称,而是偏移量

[英]DateTime::getTimezone doesn't return timezone name, but offset

<?php
$first = '2011-04-27';
$second = '2011-04-27 16:20:12';
$third = '2011-04-27 16:20:12+00';

$dt = new DateTime($first);
$dt->setTimeZone(new DateTimeZone($dt->getTimeZone()->getName()));
echo $dt->getTimezone()->getName().'<br />';
// OK
$dt = new DateTime($second);
$dt->setTimeZone(new DateTimeZone($dt->getTimeZone()->getName()));
echo $dt->getTimezone()->getName().'<br />';
// OK
$dt = new DateTime($third);
$dt->setTimeZone(new DateTimeZone($dt->getTimeZone()->getName()));
echo $dt->getTimezone()->getName().'<br />';
// Error
// ->getName() returns unexpectedly +00, which is not a name, but offset

DateTime 从最后一个字符串 timezone name +00中提取,这实际上不是name ,而是offset ,因此不能设置为 timezone ...

在(反)序列化 DateTime object 时,此行为会导致问题...

public function __sleep()
{
    $this->fix = array($this->format('Y-m-d H:i:s'), $this->getTimezone()->getName());
    return array('fix');
}

public function __wakeup()
{
    $this->__construct($this->fix[0], new DateTimeZone($this->fix[1]));
    unset($this->fix);
}

我知道最好得到例如这个字符串: 2011-04-27 16:20:12 UTC ,无论如何,只要方法被称为getName() ,它不应该返回+00作为名称,还是应该?

您尝试使用时区偏移+00创建DateTime object ,这就是它返回偏移而不是有效时区标识符的原因,实际上这意味着GMT+0000 根据 DateTime object(或系统)中的当前时区设置,使用不带偏移量的日期时间字符串,您将获得 PHP 时区标识符。

$third = '2011-04-27 16:20:12+00'; 您已在DateTime object 而不是 PHP 标识符中设置了+00:00偏移量,而DateTime仅使用->getName()方法将其返回。

固定偏移不提供有关 DST 规则的信息,因此它不能用于取回 PHP 时区标识符。 示例:在我的区域中,目前是GMT+2 (活动 DST),但如果我将它放在日期时间字符串中,DateTime object 无法知道我的偏移量何时更改为+1 ,简单地说,它总是 GMT+0200 ......全部。

在您的情况下,偏移量+00匹配许多不同的时区标识符,例如Atlantic/ReykjavíkAfrica/CasablancaAfrica/Nouakchott等。

这就是为什么 getName() 方法返回时间偏移而不是时区的原因!

这不是官方的解释,但简而言之就是这样。

当然, 2011-04-27 16:20:12+00不是有效的日期时间字符串。

当我运行该代码时,PHP 说它无法识别该格式(格式在此处定义),因此 output 是错误的结果。 但是,我能够像这样运行它:

$third = '2011-04-27 16:20:12 GMT';

$dt = new DateTime($third);
$dt->setTimeZone(new DateTimeZone($dt->getTimeZone()->getName()));
echo $dt->getTimezone()->getName().'<br />';

我认为您可以将+00替换为GMT

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM