我试图与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,那么如何才能在同一时区进行比较呢?
提前致谢
答案 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);