将datetime与不同的timezone_type php进行比较

时间:2014-09-05 10:15:08

标签: php datetime timezone

我试图与PHP中的DateTime对象进行比较。

$Time1 = DateTime::createFromFormat('UP', '1409900072+0200');

$Time2 = new DateTime('2014-09-05 07:54:32');

时间2使用欧洲/哥本哈根的defoult,比较以下产量

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,那么如何才能在同一时区进行比较呢?

提前致谢

2 个答案:

答案 0 :(得分:1)

真正奇怪的部分是你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

请注意,PHP before 5.3.9似乎在createFromFormat调用时出现问题;如果你需要支持那些版本,你可能需要手动过滤掉尾随时区。

答案 1 :(得分:0)

将两个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);