将datetime与不同的时区类型php进行比较


compare datetime with different timezone_type php

我正在尝试与PHP中的DateTime对象进行比较。

$Time1 = DateTime::createFromFormat('UP', '1409900072+0200');
$Time2 = new DateTime('2014-09-05 07:54:32');

Time2使用欧洲/哥本哈根的default,比较以下的产量

if ($Time2 > $Time1){
    echo "true 'n";
} else {
    echo "false 'n";
}
true 
object(DateTime)#1 (3) {
  ["date"]=>
  string(19) "2014-09-05 06:54:32"
  ["timezone_type"]=>
  int(1)
  ["timezone"]=>
  string(6) "+02:00"
}
object(DateTime)#2 (3) {
  ["date"]=>
  string(19) "2014-09-05 07:54:32"
  ["timezone_type"]=>
   int(3)
  ["timezone"]=>
  string(17) "Europe/Copenhagen"
 }

根据我的理解,Time1的实际当地时间是08:54:32,那么我如何在同一时区进行比较?

提前感谢

真正奇怪的部分是1409900072+0200的初始值。如果1409900072是一个UNIX时间戳,那么传递一个特定的时区就没有什么意义了。这似乎会导致PHP错误地创建实例;它创建的实例的时间设置为UTC值(6:54),但时区偏移量为+0200(其中时间实际上应该是8:54)。

可以说,这应该作为错误报告归档;但可以说,输入数据一开始就毫无意义。

如果您输入的是UNIX时间戳,那么忽略它可能包含的任何时区信息,并显式地将时区设置为UTC,那么一切都如预期:

$t1 = DateTime::createFromFormat('U+', '1409900072+0200', new DateTimeZone('UTC'));
$t2 = new DateTime('2014-09-05 07:54:32', new DateTimeZone('Europe/Copenhagen'));
var_dump($t1 > $t2); // true

请注意,5.3.9之前的PHP似乎在createFromFormat调用方面存在问题;如果您需要支持这些版本,您可能需要手动过滤掉尾随时区。

将两个DateTimes转换为UTC(setTimeZone('UTC')),然后进行比较。

<?php
$Time1 = DateTime::createFromFormat('UP', '1409900072+0200');
$Time2 = new DateTime('2014-09-05 07:54:32');
// convert
$utc = new DateTimeZone('UTC');
$time1_utc = clone $Time1;
$time1_utc->setTimeZone($utc);
$time2_utc = clone $Time2;
$time2_utc->setTimeZone($utc);
var_dump($Time1,$Time2);
var_dump($time1_utc,$time2_utc);