编程语言
首页 > 编程语言> > PHP-无法将正确的DateTimeZone设置为DateTime

PHP-无法将正确的DateTimeZone设置为DateTime

作者:互联网

背景
我有一个设置为某个(英国)时间的事件列表.我希望用户可以在当地时间查看活动时间.例如:如果某个活动在英国时间20:30开始,则来自荷兰的用户应将开始时间视为21:30.

问题
我已经完成所有设置,并正在创建新的DateTime对象以将事件设置为.但是,当我指定我的DateTimeZone对象时,它将显示00:00而不是我为其创建的DateTimeZone.这意味着新的时间是不正确的.因此,原定为20:30的英国时间仍以20:30 NL时间代替21:30展开.


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

默认设置:

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的顺序有关.

>我尝试在创建DateTime对象之前创建DateTimeZone.我确保它是正确的对象,然后在DateTime构造函数中进行设置.
>我尝试首先仅使用时间戳作为参数创建DateTime对象,然后再设置DateTimeZone对象(我知道存在/曾经存在一个错误,该错误导致直接设置DateTimeZone会产生一些奇怪的行为).
>我已根据docs确定要设置的时区(欧洲/阿姆斯特丹)合法.

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

我还针对基本要点研究了这些问题,但它们没有这样的问题:
 1. Converting between timezones in PHP
 2. How to convert between time zones in PHP using the DateTime class?

我又追踪了几个,但目前找不到它们.


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

编辑
再次检查我的DateTimeZone对象正确之后,得到以下信息:

DateTimeZone Object
(
    [timezone_type] => 3
    [timezone] => Europe/Amsterdam
)

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

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

您会注意到不同的timezone_type和timezone.

解决方法:

使用方法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对象,则可以对其进行克隆并修改克隆的时区:

$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.

标签:timezone,datetime-conversion,datetime,php
来源: https://codeday.me/bug/20191028/1953455.html