gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:35:34 24 4
gpt4 key购买 nike

<?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 从最后一个字符串时区 name +00 中提取,这实际上不是 name,而是 offset因此不能设置为时区...

在(反)序列化 DateTime 对象时,此行为会导致麻烦...

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 作为名称,还是应该?

最佳答案

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

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

固定偏移量不提供有关 DST 规则的信息,因此它不能用于获取 PHP 时区标识符。示例:在我的区域中,目前是 GMT+2(有效 DST),但如果我将其放入日期时间字符串中,DateTime 对象无法知道我的偏移量何时更改为 +1 code>,简单来说,它始终是 GMT+0200...仅此而已。

您的情况下的

Offset +00 与许多不同的时区标识符匹配,例如 Atlantic/ReykjavíkAfrica/Cas​​ablancaAfrica/努瓦克肖特

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

这不是官方解释,只是简短版本。

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

关于php - DateTime::getTimezone 不返回时区名称,而是返回偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5806322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com