wake-up-neo.com

Wie überprüfe ich, ob ein Datum in einem bestimmten Bereich liegt?

Wenn Sie einen $start_date Und einen $end_date Haben, wie können Sie überprüfen, ob ein vom Benutzer angegebenes Datum in diesen Bereich fällt?

z.B.

$start_date = '2009-06-17';

$end_date = '2009-09-05';

$date_from_user = '2009-08-28'; 

Im Moment sind die Daten Zeichenfolgen. Würde es helfen, sie in Ganzzahlen mit Zeitstempeln umzuwandeln?

74
meleyal

Das Konvertieren in Zeitstempel ist der richtige Weg, wenn Sie strtotime verwenden, z.

$start_date = '2009-06-17';

$end_date = '2009-09-05';

$date_from_user = '2009-08-28';

check_in_range($start_date, $end_date, $date_from_user);


function check_in_range($start_date, $end_date, $date_from_user)
{
  // Convert to timestamp
  $start_ts = strtotime($start_date);
  $end_ts = strtotime($end_date);
  $user_ts = strtotime($date_from_user);

  // Check that user date is between start & end
  return (($user_ts >= $start_ts) && ($user_ts <= $end_ts));
}
110
ConroyP

Es ist nicht erforderlich, in einen Zeitstempel zu konvertieren, um den Vergleich durchzuführen, da die Zeichenfolgen als Datumsangaben im kanonischen Format 'JJJJ-MM-TT' validiert sind.

Dieser Test wird funktionieren:

( ( $date_from_user >= $start_date ) && ( $date_from_user <= $end_date ) )

gegeben:

$start_date     = '2009-06-17';
$end_date       = '2009-09-05';
$date_from_user = '2009-08-28';

HINWEIS: Der Vergleich solcher Zeichenfolgen ermöglicht "ungültige" Daten, z. (32. Dezember) '2009-13-32' und für seltsam formatierte Zeichenfolgen '2009/3/3', sodass ein Zeichenfolgenvergleich NICHT einem Datums- oder Zeitstempelvergleich entspricht. Dies funktioniert NUR, wenn die Datumswerte in den Zeichenfolgen in einem KONSISTENTEN und KANONISCHEN stehen Format.

EDIT um hier eine Notiz hinzuzufügen und das Offensichtliche zu erläutern.

Mit KONSISTENT meine ich zum Beispiel, dass die zu vergleichenden Zeichenfolgen dasselbe Format haben müssen: Der Monat muss immer zwei Zeichen haben, der Tag muss immer zwei Zeichen haben , und das Trennzeichen muss immer ein Bindestrich sein. Wir können "Strings" nicht zuverlässig vergleichen, die nicht aus vier Zeichen (Jahr, Monat und Tag) bestehen. Wenn wir beispielsweise eine Mischung aus einem Zeichen und zwei Zeichenmonaten in den Zeichenfolgen hätten, würden wir ein unerwartetes Ergebnis erhalten, wenn wir '2009-9-30' Mit '2009-10-11' Vergleichen. Wir sehen "9" menschlich als kleiner als "10", aber ein Zeichenkettenvergleich sieht '2009-9' Als größer als '2009-1'. Wir müssen nicht unbedingt ein Trennzeichen für Bindestriche haben. wir könnten genauso zuverlässig Zeichenfolgen im Format 'YYYYMMDD' vergleichen; Wenn es ein Trennzeichen gibt, muss es immer da und immer gleich sein.

Mit KANONISCH meine ich ein Format, das zu Zeichenfolgen führt, die in Datumsreihenfolge sortiert werden. Dies bedeutet, dass die Zeichenfolge zuerst "Jahr", dann "Monat" und dann "Tag" darstellt. Wir können Strings im Format 'MM-DD-YYYY' Nicht zuverlässig vergleichen, da dies nicht kanonisch ist. Ein String-Vergleich würde den MM (Monat) vor dem YYYY (Jahr) vergleichen, da der String-Vergleich von links nach rechts funktioniert.) Ein großer Vorteil des 'JJJJ-MM-TT' Zeichenfolgeformat ist, dass es kanonisch ist; In diesem Format dargestellte Daten können zuverlässig als Zeichenfolgen verglichen werden.

[NACHTRAG]

Wenn Sie sich für die Umwandlung von PHP-Zeitstempeln entscheiden, beachten Sie die Einschränkungen.

Auf einigen Plattformen unterstützt PHP keine Timestamp-Werte vor dem 01.01.1970 und/oder nach dem 19.01.2038. (Das liegt in der Natur der 32-Bit-Ganzzahl des Unix-Zeitstempels.) Spätere Versionen von pf php (5.3?) Sollen das beheben.

Die Zeitzone kann auch ein Problem sein, wenn Sie beim Konvertieren von Zeichenfolge zu Zeitstempel und von Zeitstempel zurück zu Zeichenfolge nicht darauf achten, dieselbe Zeitzone zu verwenden.

HTH

46
spencer7593

Verwenden Sie die DateTime-Klasse, wenn Sie PHP 5.3+. Einfachere Verwendung, bessere Funktionalität.

DateTime unterstützt intern Zeitzonen, bei den anderen Lösungen liegt es an Ihnen, damit umzugehen.

<?php    
/**
 * @param DateTime $date Date that is to be checked if it falls between $startDate and $endDate
 * @param DateTime $startDate Date should be after this date to return true
 * @param DateTime $endDate Date should be before this date to return true
 * return bool
 */
function isDateBetweenDates(DateTime $date, DateTime $startDate, DateTime $endDate) {
    return $date > $startDate && $date < $endDate;
}

$fromUser = new DateTime("2012-03-01");
$startDate = new DateTime("2012-02-01 00:00:00");
$endDate = new DateTime("2012-04-30 23:59:59");

echo isDateBetweenDates($fromUser, $startDate, $endDate);
41
oldwizard
$startDatedt = strtotime($start_date)
$endDatedt = strtotime($end_date)
$usrDatedt = strtotime($date_from_user)

if( $usrDatedt >= $startDatedt && $usrDatedt <= $endDatedt)
{
   //..falls within range
}
4
Stan R.

Konvertieren Sie dann beide Daten in Zeitstempel

pseudocode:

if date_from_user > start_date && date_from_user < end_date
    return true
3
Glen

In dem von Ihnen angegebenen Format müssen Sie, vorausgesetzt der Benutzer ist intelligent genug, um gültige Daten anzugeben, nicht zuerst in ein Datum konvertieren, sondern können diese als Zeichenfolgen vergleichen.

3
richardtallent
$start_date="17/02/2012";
$end_date="21/02/2012";
$date_from_user="19/02/2012";

function geraTimestamp($data)
{
    $partes = explode('/', $data); 
    return mktime(0, 0, 0, $partes[1], $partes[0], $partes[2]);
}


$startDatedt = geraTimestamp($start_date); 
$endDatedt = geraTimestamp($end_date);
$usrDatedt = geraTimestamp($date_from_user);

if (($usrDatedt >= $startDatedt) && ($usrDatedt <= $endDatedt))
{ 
    echo "Dentro";
}    
else
{
    echo "Fora";
}
3
Paulo Henrique

Wandle sie in Datums- oder Zeitstempel-Ganzzahlen um und überprüfe dann einfach, ob $ date_from_user <= $ end_date und> = $ start_date ist

2
TheTXI

Sie können dies versuchen:

//custom date for example
$d1 = new DateTime("2012-07-08");
$d2 = new DateTime("2012-07-11");
$d3 = new DateTime("2012-07-08");
$d4 = new DateTime("2012-07-15");

//create a date period object
$interval = new DateInterval('P1D');
$daterange = iterator_to_array(new DatePeriod($d1, $interval, $d2));
$daterange1 = iterator_to_array(new DatePeriod($d3, $interval, $d4));
array_map(function($v) use ($daterange1) { if(in_array($v, $daterange1)) print "Bingo!";}, $daterange);
1
Ilya

Ich fand diese Methode am einfachsten:

$start_date = '2009-06-17';
$end_date = '2009-09-05';
$date_from_user = '2009-08-28';

$start_date = date_create($start_date);
$date_from_user = date_create($date_from_user);
$end_date = date_create($end_date);

$interval1 = date_diff($start_date, $date_from_user);
$interval2 = date_diff($end_date, $date_from_user);

if($interval1->invert == 0){
  if($interval2->invert == 1){

     // if it lies between start date and end date execute this code

  }
}
0
iniravpatel