2014-09-02 15 views
29

Chciałbym sprawdzić, czy data jest dzisiaj, jutro, wczoraj czy też. Ale mój kod nie działa.PHP: Jak sprawdzić, czy data jest dzisiaj, wczoraj czy jutro

Kod:

$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 

} 

Kodeks zawsze idzie w przypadku innego.

+0

Jak zdefiniowano '$ timestamp' i gdzie? –

+0

sprawdź datę używając strtotime – Khushboo

+0

Poradziłbym ci, abyś rzucił okiem na ** obiekt ** Datetime .. I najprawdopodobniej twój $ timestamp nie jest poprawnie konwertowany. – Naruto

Odpowiedz

31

pierwsze. Masz błąd w użyciu funkcji strtotime zobacz PHP documentation

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

Trzeba zmodyfikować kod przekazać całkowitą timestamp do tej funkcji.

Po drugie. Używasz formatu d.m.Y H: i zawierającego część czasu. Jeśli chcesz porównać tylko daty, musisz usunąć część czasu, np. `$ date = date (" d.m.Y ");` `

Po trzecie. Nie jestem pewien, czy to działa w ten sam sposób dla ciebie, ale mój PHP nie rozumie formatu daty z $timestamp i zwraca 01.01.1970 02:00 w $match_date

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

Trzeba sprawdzić, czy strtotime($timestamp) zwraca poprawny łańcuch daty. Jeśli nie, musisz określić format, który jest używany w zmiennej $timestamp. Można to zrobić przy użyciu jednej z funkcji date_parse_from_format lub DateTime::createFromFormat

To jest przykład praca:

$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

Jaki "przypadek" doprowadziłby do "czasami" w twoim 'przełączniku'? Dopiero gdy '$ today' lub' $ match_date' nie sformatuje się poprawnie jako daty, może? – DACrosby

+2

Możliwe ulepszenie: '$ today' może być zdefiniowany jako' new DateTime ("today") ', co oznacza dziś o północy - część czasu zostanie automatycznie wyzerowana. – Jon

11

Myślę, że to pomoże Ci:

<?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

To działa całkiem dobrze. Tylko ostrzeżenie, nie zawsze jest dokładne. Na przykład, jeśli teraz jest godzina 10:30, a czas wczorajszy to 10:58, $ przedział-> dni == 0, co sprawia, że ​​ta data wydaje się być "Dzisiaj", co nie jest prawdą. –

+1

Wrong! To jest różnica czasu, nie dzisiaj/wczoraj ... –

+1

To nie jest czek na "dzisiaj", ale na "ostatnie 24 godziny" – 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

Za każdym razem, gdy widzisz cyfrę 86400 (60 * 60 * 24) w kodzie, wiesz ma błąd. Podobnie jak w tym przypadku: http: // ideone.com/2D2N8I – Jon

+0

@Jon: Dlaczego ta liczba jest uważana za błąd? –

+1

@DeepakJain, ponieważ nie wszystkie dni trwają 86400 sekund. Są krótsze dni i dłuższe dni ze względu na czas letni, są sekundy przestępne, wszystkie są oczywiście rzadkie, ale złamią kod, gdy się pojawią. Zobacz na przykład w linku ideone podałem powyżej, w jaki sposób ten kod zgłasza zły wynik, jeśli wybierzesz określone daty. – Jon

0

przekroczyły datę do funkcji.

  <?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

Poza tym, to naprawdę szuka więcej niż różnica 24 godzin. Jeśli sprawdzasz wczorajsze popołudnie w porównaniu do dzisiejszego poranka, powinno to powiedzieć wczoraj. Kluczem jest ignorowanie części czasu i patrzenie tylko na daty. Jeśli formatujesz każdą datę za pomocą 'date ('Y-m-d')', to będzie porównywać północ każdego dnia i będą one równe lub wielokrotne w odstępie 24 godzin. Z technicznego punktu widzenia nie potrzebowałbyś wtedy funkcji 'floor()'. –

4

Nie ma wbudowanych funkcji do tego w Php (wstyd ^^). Chcesz porównać datę ciąg do dzisiaj, można użyć prostego substr aby go osiągnąć:

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

bez daty konwersji, proste.

+0

Jeśli masz liczby całkowite, dlaczego porównałbyś łańcuchy? : D Btw jaki język ma taką funkcję? –

+0

@IvankaTodorova Swift does! –

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; 
     } 
    } 
} 
Powiązane problemy