PHP - 无法将正确的日期时区设置为日期时间



>Background


我有一个设置为特定(英国)时间的事件列表。我希望用户以当地时间查看事件的时间。例如:如果事件从英国时间开始20:30则来自荷兰的用户应看到开始时间为 21:30


问题


我已经设置好了一切,并且正在创建新的DateTime对象来设置我的事件。但是,当我指定我的DateTimeZone对象时,它显示的是+00:00而不是我为其创建的DateTimeZone。这意味着新时代是不正确的。因此,设置为英国时间20:30时间仍然作为20:30 NL时间而不是21:30推出。

法典


这是我编写的代码。据我所知,我所做的一切都是正确的,但是当分配给DateTime对象时,DateTimeZone仍然不正确。

默认设置:

date_default_timezone_set('Europe/London');

应将DateTime对象转换为本地时间的代码:

$user_timezone = Helper::get_user_timezone(); //contains "Europe/Amsterdam"
foreach($events as $event){
    $timestamp = $event->getDatetime()->getTimestamp();
    $local_datetime = new DateTime('@'.$timestamp, new DateTimeZone($user_timezone));
}

输入


我将使用以下DateTime对象作为输入:
DateTime Object
(
    [date] => 2015-02-14 19:30:00.000000
    [timezone_type] => 3
    [timezone] => Europe/London
)

输出


这将为我输出以下DateTime对象:
DateTime Object
(
    [date] => 2015-02-14 19:30:00.000000
    [timezone_type] => 1
    [timezone] => +00:00
)

我试过


什么我尝试了多种方法。主要是关于我设定DateTimeZone的顺序。
  1. 我尝试在创建DateTime对象之前创建一个DateTimeZone。我确保它是一个正确的对象,然后将其设置在DateTime构造函数中。
  2. 我尝试先创建一个仅使用时间戳作为参数的DateTime对象,然后设置DateTimeZone对象(我知道有一个错误导致直接设置DateTimeZone的一些奇怪行为)。
  3. 根据文档,我已经确保我要设置的时区(Europe/Amsterdam)是合法的。

我开始怀疑使用timestamp时是否无法转换日期?

我也看过这些问题的基本要点,但他们没有这样的问题:
1. 在 PHP
中转换时区 2. 如何使用日期时间类在PHP中转换时区?

我又跟了几个,但目前找不到他们。

问题


为什么我的DateTime对象得到不正确的DateTimeZone

编辑


再次检查我的DateTimeZone对象是否正确后,我得到以下结果:
DateTimeZone Object
(
    [timezone_type] => 3
    [timezone] => Europe/Amsterdam
)

但是当我将其设置为新的DateTime对象时,timezone_typetimezone都更改为:

DateTime Object
(
    [date] => 2015-02-14 19:30:00.000000
    [timezone_type] => 1
    [timezone] => +00:00
)

您会注意到不同的timezone_typetimezone

使用方法DateTime::setTimeZone()

date_default_timezone_set('Europe/London');
$date = new DateTime('2015-02-14 19:30:00');
print_r($date);
echo("Local time in London: ".$date->format('Y-m-d H:i:s')."n");
$date->setTimeZone(new DateTimeZone('Europe/Amsterdam'));
print_r($date);
echo("Local time in Amsterdam: ".$date->format('Y-m-d H:i:s')."n");

上面脚本的输出:

DateTime Object
(
    [date] => 2015-02-14 19:30:00.000000
    [timezone_type] => 3
    [timezone] => Europe/London
)
Local time in London: 2015-02-14 19:30:00
DateTime Object
(
    [date] => 2015-02-14 20:30:00.000000
    [timezone_type] => 3
    [timezone] => Europe/Amsterdam
)
Local time in Amsterdam: 2015-02-14 20:30:00

如果您不想修改原始$date对象,则可以clone它并修改克隆的时区:

$roDate = clone $date;
$roDate->setTimeZone(new DateTimeZone('Europe/Bucharest'));
echo("Local time in Bucharest: ".$roDate->format('Y-m-d H:i:s')."n");

显示:

Local time in Bucharest: 2015-02-14 21:30:00

言论

我在OSX上运行了PHP 5.6.6的代码。

DateTime和相关类在早期版本(PHP 5.2,PHP 5.3)中有很多错误。它们中的大多数在最新版本中都得到了修复(但仍有一些隐藏的小问题)。

我的建议是使用您可以在系统上安装的最新版本的 PHP。

根据文档:

日期时间::__construct

注意:

$timezone当 $time参数要么是 UNIX 时间戳(例如 @946684800),要么是 指定时区(例如 2010-01-28T15:00:00+02:00)。

因此,只需使用"setTimezone()"解决方案或提供日期时间字符串:)

相关内容

  • 没有找到相关文章

最新更新