只有在满足某些条件并且其中一个条件与两个日期之间的比较有关的情况下,我才会尝试执行一些更新:一个是从DB获得的,由Symfony2作为DateTime对象返回,另一个是作为字符串从循环获得并转换为DateTime对象。
这是我测试的普通代码:
$last = new DateTime('2015-01-21T19:44:25.000Z');
$current = new DateTime('2015-06-23 22:10:23');
if ($last > $current) {
echo 'yes';
} else {
echo 'no';
}
输出no。现在,如果我尝试在OOP中进行如下比较:
$lastModifiedAt = new DateTime($row['LastModifiedDate']);
$lastSyncAt = $entity->getLastSyncAt();
if ($lastModifiedAt > $lastSyncAt) {
....
}
这是var_export($lastModifiedAt)
和var_export($lastSyncAt)
:的输出
DateTime::__set_state(array(
'date' => '2015-06-16 19:23:41.000000',
'timezone_type' => 2,
'timezone' => 'Z',
))
DateTime::__set_state(array(
'date' => '2015-06-24 07:35:14.000000',
'timezone_type' => 3,
'timezone' => 'America/Caracas',
))
执行总是有条件的,为什么?我在比较中做错了什么?
编辑
这种行为对我来说很奇怪,但也许是我的代码错了。感谢@marcin orlowski我还运行了以下测试:
var_dump($lastModifiedAt == $lastSyncAt);
var_dump($lastModifiedAt > $lastSyncAt);
var_dump($lastModifiedAt < $lastSyncAt);
结果如下:
bool(false)
bool(false) => this is the comparison I am doing
bool(true)
所以比较是正确的,也许在我的代码中还有其他东西,无论如何,thx
有一个优秀的库可以处理与DateTime相关的问题。。https://github.com/briannesbitt/Carbon。如果上面提到的案例不是你处理DateTime的唯一地方,那么我会考虑在某个时候投资Carbon。
您可以使用getTimestamp():
$date = new DateTime();
echo $date->getTimestamp();
和:
if ($last->getTimestamp() > $current->getTimestamp()) {
echo 'yes';
} else {
echo 'no';
}