【问题标题】:PHP's DateTime default timezonePHP DateTime 默认时区
【发布时间】:2015-04-09 16:14:20
【问题描述】:

我最近才开始在 PHP 中使用 DateTime 对象,但现在我无法弄清楚。

我认为DateTime 会考虑我使用date_default_timezone_set 设置的默认时区,但显然它没有:

date_default_timezone_set('Europe/Oslo');
$str = strtotime('2015-04-12');
$date = new DateTime("@".$str);
$response['TZ'] = $date->getTimezone()->getName();
$response['OTZ'] = date_default_timezone_get();
$response['Date'] = $date->format('Y-m-d');

echo json_encode($response);

这是我得到的回复:

{
  "TZ":"+00:00",
  "OTZ":"Europe\/Oslo",
  "Date":"2015-04-11"
}

将正确的 DateTimeZone 传递给构造函数也不起作用,因为 DateTime 在给定 UNIX 时间戳时会忽略它。 (如果我将常规日期字符串传递给构造函数,它会起作用)。

如果我这样做,日期会正确显示:

$date->setTimezone(new DateTimeZone("Europe/Oslo"));

我真的不想在每次处理约会时都传递时区,但从看起来我可能不得不传递的情况来看?

【问题讨论】:

  • 如果有人想知道:DateTime 始终默认为 UTC

标签: php datetime timezone


【解决方案1】:

我认为是因为这里写的是: http://php.net/manual/en/datetime.construct.php

注意:$timezone 参数和当前时区被忽略 当 $time 参数是 UNIX 时间戳时(例如 @946684800) 或指定时区(例如 2010-01-28T15:00:00+02:00)。

您使用 UNIX 时间戳在构造函数中设置 DateTime 对象的日期。

尝试使用这种方式设置 DateTime 对象

$date = new DateTime('2000-01-01');

【讨论】:

  • 谢谢,我刚刚看了关于$timezone参数的部分,应该注意到了关于当前时区的部分。
【解决方案2】:

您好,您总是可以使用继承来绕过这个问题。 这是更明确的方式

**

class myDate extends DateTime{
    public function __construct($time){
        parent::__construct($time);
        $this->setTimezone(new DateTimeZone("Europe/Oslo"));
    }
}
$str = strtotime('2015-04-12');
$md = new myDate("@".$str);
echo $md->getTimezone()->getName();

**

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 2012-03-12
    • 2012-03-29
    • 1970-01-01
    相关资源
    最近更新 更多