it-swarm.com.de

PHP Prüfen Sie, ob das Datum zwischen zwei Terminen liegt

Ich habe diesen Code von Stackoverflow erhalten und etwas an das heutige Datum angepasst.

Ich möchte prüfen, ob heute zwischen zwei Terminen passt. Aber das funktioniert nicht .. Was fehlt mir?

$paymentDate = date('d/m/Y');
echo $paymentDate; // echos today! 
$contractDateBegin = date('d/m/Y', '01/01/2001');
$contractDateEnd = date('d/m/Y', '01/01/2015');

if ($paymentDate > $contractDateBegin && $paymentDate < $contractDateEnd)
{
  echo "is between";
}
else
{
echo "NO GO!";  
}
50
Papa De Beau

Dies ist die richtige Antwort für Ihren Code. Verwenden Sie einfach die Funktion strtotime () php

$paymentDate = date('Y-m-d');
$paymentDate=date('Y-m-d', strtotime($paymentDate));
//echo $paymentDate; // echos today! 
$contractDateBegin = date('Y-m-d', strtotime("01/01/2001"));
$contractDateEnd = date('Y-m-d', strtotime("01/01/2012"));

if (($paymentDate > $contractDateBegin) && ($paymentDate < $contractDateEnd)){
    echo "is between";
}else{
    echo "NO GO!";  
}
126

Sie können Datumszeichenfolgen nicht vergleichen. Es ist eine gute Gewohnheit, stattdessen das DateTime -Objekt von PHP zu verwenden:

$paymentDate = new DateTime(); // Today
echo $paymentDate->format('d/m/Y'); // echos today! 
$contractDateBegin = new DateTime('2001-01-01');
$contractDateEnd  = new DateTime('2015-01-01');

if (
  $paymentDate->getTimestamp() > $contractDateBegin->getTimestamp() && 
  $paymentDate->getTimestamp() < $contractDateEnd->getTimestamp()){
  echo "is between";
}else{
   echo "NO GO!";  
}
28
luttkens

Wenn Stunden von Bedeutung sind:

$paymentDate = strtotime(date("Y-m-d H:i:s"));
$contractDateBegin = strtotime("2014-01-22 12:42:00");
$contractDateEnd = strtotime("2014-01-22 12:50:00");

if($paymentDate > $contractDateBegin && $paymentDate < $contractDateEnd) {
   echo "is between";
} else {
    echo "NO GO!";  
}    

Sie vergleichen die Datumsangaben als Zeichenfolgen, die jedoch nicht funktionieren, da der Vergleich lexikografisch ist. Es ist das gleiche Problem wie beim Sortieren einer Textdatei, bei der eine Zeile 20 nach einer Zeile 100 angezeigt würde, da der Inhalt nicht als Zahlen, sondern als Folgen von ASCII - Codes behandelt wird. Darüber hinaus sind die erstellten Datumsangaben falsch, da Sie eine Zeichenfolge verwenden, bei der ein Zeitstempel erwartet wird (zweites Argument).

Stattdessen sollten Sie Zeitstempel von DateTime-Objekten vergleichen, zum Beispiel:

 $paymentDate = date_create();
 $contractDateBegin = date_create_from_format('d/m/Y', '01/01/2001');
 $contractDateEnd = date_create_from_format('d/m/Y', '01/01/2015');

Ihre bestehenden Bedingungen funktionieren dann korrekt.

4
Jon

Eine andere Lösung wäre gewesen, das als Ymd geschriebene Datum zu berücksichtigen.

Geschrieben in diesem "Format" ist es sehr einfach, Datumsangaben zu vergleichen.

$paymentDate       = date('Ymd'); // on 4th may 2016, would have been 20160504
$contractBegin     = 20010101;
$contractEnd       = 20160101;
echo ($paymentDate >= $contractBegin && $paymentDate <= $contractEnd) ? "Between" : "Not Between";

Es funktioniert immer für jeden Tag des Jahres und hängt nicht von Funktionen oder Konvertierungen ab (PHP berücksichtigt den int-Wert von $paymentDate zum Vergleich mit dem int-Wert von contractBegin und contractEnd).

2
ChtiSeb

Basierend auf Luttkens Antwort. Ich dachte, ich würde meinen Twist hinzufügen :)

function dateIsInBetween(\DateTime $from, \DateTime $to, \DateTime $subject)
{
    return $subject->getTimestamp() > $from->getTimestamp() && $subject->getTimestamp() < $to->getTimestamp() ? true : false;
}

$paymentDate       = new \DateTime('now');
$contractDateBegin = new \DateTime('01/01/2001');
$contractDateEnd   = new \DateTime('01/01/2016');

echo dateIsInBetween($contractDateBegin, $contractDateEnd, $paymentDate) ? "is between" : "NO GO!";
1

Direkt verwenden

$paymentDate = strtotime(date("d-m-Y"));
$contractDateBegin = strtotime("01-01-2001");
$contractDateEnd = strtotime("01-01-2015");

Dann ist der Vergleich in Ordnung, da Ihr 01-01-2015 für den 32-Bit-Datumsbereich von PHP gültig ist, wie im Handbuch von strtotime angegeben.

0
1000Gbps

Eine andere Lösung (mit der Annahme, dass Ihre Datumsformate immer YYYY/MM/DD mit führenden Nullen sind) ist die Funktion max () und min (). Ich denke, das ist in Ordnung, wenn alle anderen Antworten auch das Format jjjj-mm-tt voraussetzen. Dies ist die übliche Namenskonvention für Ordner in Dateisystemen, wenn Sie jemals sicherstellen wollten, dass sie nach Datum sortiert sind.

Wie andere schon gesagt haben, können Sie die Strings angesichts der Reihenfolge der Zahlen vergleichen, ohne dass die strtotime () - Funktion erforderlich ist.

Beispiele:

$biggest = max("2018/10/01","2018/10/02");

Der Vorteil ist, dass Sie mehr Daten eingeben können, anstatt nur zwei zu vergleichen.

$biggest = max("2018/04/10","2019/12/02","2016/03/20");

Um herauszufinden, ob ein Datum zwischen zwei Datumsangaben liegt, können Sie Das Ergebnis von min () und max () vergleichen.

$startDate="2018/04/10";
$endDate="2018/07/24";
$check="2018/05/03";
if(max($startDate,$check)==min($endDate,$check)){
    // It's in the middle
}

Es würde mit keinem anderen Datumsformat funktionieren, aber für dieses Format funktioniert es. Keine Umwandlung in Sekunden und keine Datumsfunktion erforderlich.

0

Wenn Sie Datumsangaben benötigen, um dynamisch zu sein ..

$todayStr = date('Y-m-d');
$todayObj=date('Y-m-d', strtotime($todayStr));
$currentYrStr =  date('Y');
$DateBegin = date('Y-m-d', strtotime("06/01/$currentYrStr"));
$DateEnd = date('Y-m-d', strtotime("10/01/$currentYrStr"));
if (($todayObj > $contractDateBegin) && ($paymentDate < $contractDateEnd)){
    $period="summer";
}else{
   $period="winter";  
}
0
Jim Turner

Die oben genannten Methoden sind nützlich, aber nicht vollständig beweisfähig, da sie bei einer Zeit zwischen 12:00 Uhr und 01:00 Uhr/PM zu Fehlern führen. Es wird das "No Go" zurückgegeben, obwohl es zwischen dem Timing liegt. Hier ist der Code für das gleiche:

$time = '2019-03-27 12:00 PM';

$date_one = $time; 
$date_one = strtotime($date_one);
$date_one = strtotime("+60 minutes", $date_one);
$date_one =  date('Y-m-d h:i A', $date_one);

$date_ten = strtotime($time); 
$date_ten = strtotime("-12 minutes", $date_ten); 
$date_ten = date('Y-m-d h:i A', $date_ten);

$paymentDate='2019-03-27 12:45 AM';

$contractDateBegin = date('Y-m-d h:i A', strtotime($date_ten)); 
$contractDateEnd = date('Y-m-d h:i A', strtotime($date_one));

echo $paymentDate; 
echo "---------------"; 
echo $contractDateBegin; 
echo "---------------"; 
echo $contractDateEnd; 
echo "---------------";

$contractDateEnd='2019-03-27 01:45 AM';

if($paymentDate > $contractDateBegin && $paymentDate < $contractDateEnd)  
{  
 echo "is between";
} 
else
{  
  echo "NO GO!";  
}

Hier wird "NO Go" ausgegeben, weil 12:45 > 01:45.

Stellen Sie sicher, dass für "AM" Werte von 01:00 AM bis 12:00 AM in das 24-Stunden-Format konvertiert werden, um ein korrektes Ausgabedatum dazwischen zu erhalten. Dieser kleine Trick hat mir geholfen.

0

Einfache Lösung:

function betweenDates($cmpDate,$startDate,$endDate){ 
   return (date($cmpDate) > date($startDate)) && (date($cmpDate) < date($endDate));
}
0
Spock