PHP - 无法将DateTimeZone设置为DateTime

时间:2015-03-12 20:49:05

标签: php datetime timezone datetime-conversion

背景


我有一个设置为某个(英国)时间的事件列表。我希望用户在当地时间看到活动的时间。例如:如果某个活动在英国时间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的顺序。

  1. 我尝试在创建DateTimeZone对象之前创建DateTime。我确定它是一个正确的对象,然后在DateTime构造函数中设置它。
  2. 我首先尝试使用时间戳作为参数创建DateTime对象,然后设置DateTimeZone对象(我知道/有一个错误导致设置{{1直接)。
  3. 根据docs,我确定要设置的时区(DateTimeZone)是合法的。
  4. 我开始怀疑使用Europe/Amsterdam时是否无法转换日期?

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

    我跟了几个,但我现在找不到它们。

    问题


    为什么我的timestamp对象的格式不正确DateTime

    修改


    再次检查我的DateTimeZone对象是否正确后,我得到以下内容:

    DateTimeZone

    但当我将其设置为新的DateTimeZone Object ( [timezone_type] => 3 [timezone] => Europe/Amsterdam ) 对象时,DateTimetimezone_type都会更改为:

    timezone

    您会注意到不同的DateTime Object ( [date] => 2015-02-14 19:30:00.000000 [timezone_type] => 1 [timezone] => +00:00 ) timezone_type

2 个答案:

答案 0 :(得分:4)

使用方法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。

答案 1 :(得分:0)

根据文档:

DateTime::__construct

  

注意:

     

$ timezone参数和当前时区将在   $ time参数是UNIX时间戳(例如@ 946684800)或   指定一个时区(例如2010-01-28T15:00:00 + 02:00)。

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