比较PHP中的DateTime日期值

时间:2010-11-28 17:00:11

标签: php datetime

比较两个不同DateTime对象的 date 值的最佳方法是什么?也就是说,比较年/月/日,但忽略时间。

具体来说,我正在尝试检查DateTime对象数组中是否找到给定的DateTime日期值。

function dateExists($aDateTime, $anArrayOfDateTimes) {
...
}

由于

5 个答案:

答案 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);

$resultDateTime对象(如果找到)或其他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;
}