比较两个不同DateTime对象的 date 值的最佳方法是什么?也就是说,比较年/月/日,但忽略时间。
具体来说,我正在尝试检查DateTime对象数组中是否找到给定的DateTime日期值。
function dateExists($aDateTime, $anArrayOfDateTimes) {
...
}
由于
答案 0 :(得分:2)
您可以使用array_filter
:
<?php
$dates = array(
new DateTime('2000-12-01'),
new DateTime('2005-01-20'),
new DateTime('2010-05-06'),
new DateTime('2008-04-03'),
new DateTime('2007-11-05'),
);
$theDate = new DateTime('2010-05-06');
$result = array_shift(array_filter($dates, function($d) use ($theDate) {
return $d->format('Y-m-d') == $theDate->format('Y-m-d');
}));
var_dump($result);
$result
是DateTime
对象(如果找到)或其他false
。
答案 1 :(得分:1)
您可以使用mktime功能将零置于小时,分钟,秒字段中。然后比较这样的结果:
function compareDate($d1, $d2)
{
$d1 = date_parse ($d1);
$d2 = date_parse ($d2);
return mktime (0, 0, 0, $d2['month'], $d2['day'], $d2['year']) - mktime (0, 0, 0, $d1['month'], $d1['day'], $d1['year'])
}
注意mktime参数的奇数顺序。 PHP 5.3添加了datediff istruction。
答案 2 :(得分:1)
又一个版本
function arrayContainsDate($array, $date, $format = 'Y-m-d')
{
if (is_string($date)) {
$date = new DateTime($date);
}
$date = $date->format($format);
foreach ($array as $dt) {
if ($date === $dt->format($format)) {
return TRUE;
}
}
return FALSE;
}
用法:
$dateTimes = array();
$dateTimes[] = new DateTime('2010-11-28 05:15:00');
$dateTimes[] = new DateTime('2010-06-10 08:18:00');
$dateTimes[] = new DateTime('2010-12-28 20:20:00');
var_dump(
arrayContainsDate($dateTimes, '2010-12-01 06:06:06'),
arrayContainsDate($dateTimes, '2010-06-10 13:12:11'),
arrayContainsDate($dateTimes, new DateTime('2010-01-01 01:10:10')),
arrayContainsDate($dateTimes, new DateTime('2010-12-28 23:15:00'))
);
输出(run on codepad):
bool(false)
bool(true)
bool(false)
bool(true)
如果不介意将数组转换为对象,可以考虑创建一个DateTime Collection,而不是可以保存这个和其他方法(example)。
答案 3 :(得分:0)
如果您要比较两个日期,我建议您使用strtotime执行对unix时间值的检查。
答案 4 :(得分:0)
除了为每个对象创建格式化的日期字符串之外,我没有看到任何其他方式:
function dateExists($aDateTime, $anArrayOfDateTimes)
{
$format = 'Ymd';
$dateString = $aDateTime->format($format);
foreach($anArrayOfDateTimes as $DateTimeToCompare)
if($DateTimeToCompare->format($format) === $dateString)
return true;
return false;
}