2014-09-02 10 views
29

Ich würde gerne überprüfen, ob ein Datum heute, morgen, gestern oder sonst ist. Aber mein Code funktioniert nicht.PHP: Wie überprüft man, ob ein Datum heute, gestern oder morgen ist?

Code:

$timestamp = "2014.09.02T13:34"; 
$date = date("d.m.Y H:i"); 
$match_date = date('d.m.Y H:i', strtotime($timestamp)); 

if($date == $match_date) { 

    //Today 

} elseif(strtotime("-1 day", $date) == $match_date) { 

    //Yesterday 

} elseif(strtotime("+1 day", $date) == $match_date) { 

    //Tomorrow 

} else { 

    //Sometime 

} 

Der Kodex immer im anderen Fall geht.

+0

Wie ist '$ timestamp' definiert und wo? –

+0

Überprüfen Sie das Datum mit strtotime – Khushboo

+0

Ich würde Ihnen raten, ** Datetime ** -Objekt zu betrachten .. Und höchstwahrscheinlich Ihre $ Timestamp wird nicht korrekt konvertiert. – Naruto

Antwort

31

Erste. Sie haben Fehler in Funktion strtotimePHP documentation

int strtotime (string $time [, int $now = time() ]) 

Sie sehen müssen Sie den Code ändern, um Integer-Zeitstempel in dieser Funktion übergeben.

Sekunde. Sie verwenden Format d.m.Y H: ich, die Zeit Teil enthält. Wenn Sie nur Daten vergleichen möchten, müssen Sie den Zeitabschnitt entfernen, z. `$ date = date (" d.m.Y ");` `

Dritte. Ich bin nicht sicher, ob es für Sie auf die gleiche Art und Weise funktioniert, aber meine PHP versteht nicht, Datumsformat von $timestamp und gibt 01.01.1970 02.00 in $match_date

$timestamp = "2014.09.02T13:34"; 
date('d.m.Y H:i', strtotime($timestamp)) === "01.01.1970 02:00"; 

Sie müssen überprüfen, ob strtotime($timestamp) gibt die korrekte Datumszeichenkette zurück. Wenn nein, müssen Sie das Format angeben, das in der Variablen $timestamp verwendet wird. Sie können diese über einen Link Funktionen tun date_parse_from_format oder DateTime::createFromFormat

Dies ist ein Arbeits Beispiel ist:

$timestamp = "2014.09.02T13:34"; 

$today = new DateTime(); // This object represents current date/time 
$today->setTime(0, 0, 0); // reset time part, to prevent partial comparison 

$match_date = DateTime::createFromFormat("Y.m.d\\TH:i", $timestamp); 
$match_date->setTime(0, 0, 0); // reset time part, to prevent partial comparison 

$diff = $today->diff($match_date); 
$diffDays = (integer)$diff->format("%R%a"); // Extract days count in interval 

switch($diffDays) { 
    case 0: 
     echo "//Today"; 
     break; 
    case -1: 
     echo "//Yesterday"; 
     break; 
    case +1: 
     echo "//Tomorrow"; 
     break; 
    default: 
     echo "//Sometime"; 
} 
+0

Was für ein 'Fall' würde zu dem" manchmal "in deinem' Schalter' führen? Nur wenn '$ today' oder' $ match_date' nicht korrekt als Daten formatiert sind, vielleicht? – DACrosby

+2

Eine mögliche Verbesserung: '$ today' kann nur als' new DateTime ("today") 'definiert werden, was heute um Mitternacht bedeutet, dass der Zeitteil automatisch auf Null gesetzt wird. – Jon

11

Ich denke, das wird Ihnen helfen:

<?php 
$date = new DateTime(); 
$match_date = new DateTime($timestamp); 
$interval = $date->diff($match_date); 

if($interval->days == 0) { 

    //Today 

} elseif($interval->days == 1) { 
    if($interval->invert == 0) { 
     //Yesterday 
    } else { 
     //Tomorrow 
    } 
} else { 
    //Sometime 
} 
+4

Das funktioniert ziemlich gut. Nur eine Warnung, es ist nicht immer genau. Zum Beispiel, wenn die Zeit jetzt 10:30 Uhr ist und die gestrige Zeit 10:58 Uhr ist, ist $ interval -> days == 0, was dieses Datum als "Heute" erscheinen lässt, was nicht wahr ist. –

+1

Falsch! Dies ist der Zeitunterschied, nicht heute/gestern ... –

+1

Dies ist kein Check für "heute", sondern für "letzte 24 Stunden" – sieppl

20
<?php 
$current = strtotime(date("Y-m-d")); 
$date = strtotime("2014-09-05"); 

$datediff = $date - $current; 
$difference = floor($datediff/(60*60*24)); 
if($difference==0) 
{ 
    echo 'today'; 
} 
else if($difference > 1) 
{ 
    echo 'Future Date'; 
} 
else if($difference > 0) 
{ 
    echo 'tomarrow'; 
} 
else if($difference < -1) 
{ 
    echo 'Long Back'; 
} 
else 
{ 
    echo 'yesterday'; 
} 
?> 
+1

Jedes Mal, wenn Sie die Nummer 86400 (60 * 60 * 24) im Code sehen, wissen Sie Es hat einen Fehler. Wie in diesem Fall auch gilt: http: // ideone.com/2D2N8I – Jon

+0

@Jon: Warum diese Nummer als ein Fehler angesehen wird? –

+1

@DeepakJain, weil nicht alle Tage 86400 Sekunden lang sind. Es gibt kürzere Tage und längere Tage wegen der Sommerzeit, es gibt Schaltsekunden, alle diese sind natürlich seltene Ereignisse, aber sie werden Ihren Code brechen, wenn sie passieren. Siehe zum Beispiel in dem obigen ideone-Link, wie dieser Code das falsche Ergebnis meldet, wenn Sie bestimmte Daten auswählen. – Jon

0

Übergeben Sie das Datum in die Funktion.

  <?php 
       function getTheDay($date) 
       { 
        $curr_date=strtotime(date("Y-m-d H:i:s")); 
        $the_date=strtotime($date); 
        $diff=floor(($curr_date-$the_date)/(60*60*24)); 
        switch($diff) 
        { 
         case 0: 
          return "Today"; 
          break; 
         case 1: 
          return "Yesterday"; 
          break; 
         default: 
          return $diff." Days ago"; 
        } 
       } 
      ?> 
+0

Außer, das ist wirklich auf der Suche nach mehr als einem Unterschied von 24 Stunden. Wenn Sie eine Zeit von gestern Nachmittag im Vergleich zu heute Morgen überprüfen, sollte es gestern sagen. Der Schlüssel ist, die Zeitteile zu ignorieren und nur die Daten zu betrachten. Wenn Sie jedes Datum mit "Datum" ('Y-m-d') formatieren, wird es Mitternacht an jedem Tag verglichen, und sie sind entweder gleich oder ein Vielfaches von 24 Stunden auseinander. Technisch würden Sie dann auch nicht die 'floor()' Funktion benötigen. –

4

Es gibt keine eingebauten Funktionen, dass in Php zu tun (Schande ^^). Sie wollen ein Datum Zeichenfolge heute vergleichen, können Sie eine einfache substr verwenden, es zu erreichen:

if (substr($timestamp, 0, 10) === date('Y.m.d')) { today } 
elseif (substr($timestamp, 0, 10) === date('Y.m.d', strtotime('-1 day')) { yesterday } 

Keine Datumsumstellung, einfach.

+0

Wenn Sie die ganzen Zahlen haben, warum würden Sie die Strings vergleichen? : D BTW welche Sprache hat eine solche Funktion? –

+0

@IvankaTodorova Swift macht! –

1
function getRangeDateString($timestamp) { 
    if ($timestamp) { 
     $currentTime=strtotime('today'); 
     // Reset time to 00:00:00 
     $timestamp=strtotime(date('Y-m-d 00:00:00',$timestamp)); 
     $days=round(($timestamp-$currentTime)/86400); 
     switch($days) { 
      case '0'; 
       return 'Today'; 
       break; 
      case '-1'; 
       return 'Yesterday'; 
       break; 
      case '-2'; 
       return 'Day before yesterday'; 
       break; 
      case '1'; 
       return 'Tomorrow'; 
       break; 
      case '2'; 
       return 'Day after tomorrow'; 
       break; 
      default: 
       if ($days > 0) { 
        return 'In '.$days.' days'; 
       } else { 
        return ($days*-1).' days ago'; 
       } 
       break; 
     } 
    } 
}