2017-01-08 9 views
1

日付が連続していることをこの文字列でチェックするにはどうすればよいですか?日付がPHPと連続していることを確認してください

$dates = "2017-01-08, 2017-01-09, 2017-01-10"; 

この例では、3つの日付は連続しています。

$dates = "2017-01-08, 2017-01-12, 2017-01-13"; 

この例では、3つの日付は連続していません。

これについてのヘルプはありますか?

ありがとうございました。

+0

? '2016-02-28、2016-03-01'は有効でしょうか? – chris85

+0

@ chris85:いいところ。はい、有効であるはずです。 –

+0

2016は閏年だったので、そこには '2016-02-29'がありません。おそらくこの答えを微調整することができます。http://stackoverflow.com/questions/8461543/check-for-consecutive-dates-within-a-set-and-return-as-range – chris85

答えて

1

DateTime::diff機能を使用すると、日数の違いを得ることができます。その後、日付をループし、その差が1日でない場合、それは連続していません。

$dates = "2017-01-08, 2017-01-09, 2017-01-10"; 
var_dump(check_continuous_dates($dates)); // true 

$dates = "2017-01-08, 2017-01-12, 2017-01-13"; 
var_dump(check_continuous_dates($dates)); // false 

function check_continuous_dates($date) { 
    $date = explode(", ", $date); // Convert it to an array we can loop 
    $previous = new DateTime($date[0]); // Set the "previous" value 
    unset($date[0]); // Unset the value we just set to $previous, so we don't loop it twice 

    foreach ($date as $v) { // Loop the array 
     $current = new DateTime($v); 
     $diff = $current->diff($previous); 

     // If the difference is exactly 1 day, it's continuous 
     if ($diff->days == 1) { 
      $previous = new DateTime($v); 
     } else { 
      return false; 
     } 
    } 
    return true; 
} 

Demo

あなたがする必要がありますどのように具体的な言及

0
$datesArr = preg_split('/,\s+/', $dates); 
$startDate = new DateTime(array_shift($datesArr)); 
foreach($datesArr as $date) { 
    if ($date !== $startDate->modify("+1 day")->format("Y-m-d")) { 
    // not continuous 
    } 
} 
関連する問題