2010-11-28 12 views
1

の日付をの2つの異なるDateTimeオブジェクトの値と比較する最も良い方法は何ですか?つまり、年/月/日を比較しますが、時間は無視します。PHPのDateTime日付値を比較する

具体的には、特定のDateTimeの日付値がDateTimeオブジェクトの配列に含まれているかどうかを確認しようとしています。

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

おかげ

答えて

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のいずれかです。

0

あなたのつもりが、私はUNIXタイム値のチェックを実行するためにstrtotimeを使用することをお勧めし二つの日付を比較した場合。

+0

のstrtotime私はちょうど日付comparison-を必要とする日付とタイムを比較しますあなたの場合は質問 – Yarin

+0

@yarinをお読みください差をつけない同じ時間を入力してください。ちょうど00:00の時間であなたの日付を設定してください;) – Michael

1

mktimeを使用すると、時間、分、秒のフィールドに0を入れることができます。次に、このような結果を比較してください:

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が追加されています。

+0

ありがとう、別の良いオプション – Yarin

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) 

オブジェクトに配列を作るいけないの心は、あなたが作成することを考慮することができれば代わりにこれと他のメソッド(example)を保持できるDateTimeコレクション。

0

私は、各オブジェクトのフォーマットされた日付文字列を作成するよりも、他の方法が表示されない:

function dateExists($aDateTime, $anArrayOfDateTimes) 
{ 
    $format = 'Ymd'; 
    $dateString = $aDateTime->format($format); 

    foreach($anArrayOfDateTimes as $DateTimeToCompare) 
     if($DateTimeToCompare->format($format) === $dateString) 
      return true; 

    return false; 
}