我正在尝试与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);