2014-09-02 186 views
29

如果日期是今天,明天,昨天或其他日期,我想檢查一下。 但我的代碼不起作用。PHP:如何檢查日期是今天,昨天還是明天

代碼:

$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 

} 

守則總是去在別的情況下。

+0

'$ timestamp'是如何定義的以及在哪裏? – 2014-09-02 11:31:59

+0

使用strtotime檢查日期 – Khushboo 2014-09-02 11:32:37

+0

我建議你看看**日期時間**對象..而且很可能你的$ timestamp沒有被正確轉換。 – Naruto 2014-09-02 11:34:33

回答

31

第一。你有錯誤,使用功能strtotime看到PHP documentation

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

您需要修改代碼以整數時間戳進入此功能。

二。您使用的格式爲d.m.Y H:i包含時間部分。如果您只想比較日期,則必須刪除時間部分,例如`$ date = date(「d.m.Y」);``

三。我不知道,如果它在你以同樣的方式,但我的PHP不會$timestamp理解日期格式,並返回01.01.1970 02:00$match_date

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

您需要檢查strtotime($timestamp)返回正確的日期字符串。如果否,您需要指定在$timestamp變量中使用的格式。爲此,您可以使用的功能date_parse_from_format一個或DateTime::createFromFormat

這是一個工作的例子:

$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

什麼樣的'case'會導致你的'switch'中的「有時」?只有當'今天'或'$ match_date'沒有正確格式化爲日期,也許? – DACrosby 2015-03-12 20:22:09

+2

一個可能的改進:'$ today'可以定義爲'new DateTime(「today」)',這意味着今天午夜 - 時間部分將被自動清零。 – Jon 2015-06-27 16:07:57

11

我認爲這將有助於你:

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

這很有效。只是一個警告,它並不總是準確的。例如,如果現在的時間是上午10點30分,而且昨天的時間是上午10點58分,則$ interval-> days == 0使得該日期看起來像是「今天」,這是不正確的。 – 2015-01-13 15:38:53

+1

錯!這是時間差異,不是今天/昨天... – 2016-08-19 09:02:05

+1

這不是「今天」的檢查,而是「過去24小時」 – sieppl 2017-03-29 12:52:00

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

每當您在代碼中看到數字86400(60 * 60 * 24)時,就會知道它有一個錯誤。在這種情況下也是如此:http:// ideone。com/2D2N8I – Jon 2015-06-27 16:04:56

+0

@Jon:爲什麼這個數字被認爲是一個錯誤? – 2017-11-20 10:41:56

+1

@DeepakJain因爲不是所有的日子都是86400秒。由於夏令時時間較短且日期較長,有閏秒,所有這些當然很少出現,但是當它們發生時它們會破壞您的代碼。例如,請參閱我在上面給出的ideone鏈接,如果您選擇某些特定日期,此代碼將如何報告錯誤的結果。 – Jon 2017-11-20 13:24:30

0

傳遞的日期到函數。

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

除此之外,這實際上是尋找超過24小時的差異。如果你昨天下午的時間與今天上午比較,那麼昨天應該說。關鍵是忽略時間部分,並看看日期。如果你用'date('Y-m-d')'格式化每個日期,那麼它將每天比較午夜,它們將等於或相隔24小時的倍數。從技術上講,你不需要'floor()'函數。 – 2017-02-03 22:58:00

4

在Php(shame ^^)中沒有內置函數。要比較一個日期字符串到今天,你可以使用一個簡單的substr實現它:

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

沒有註明日期的轉換,簡單。

+0

如果你有整數,你爲什麼要比較字符串? :D Btw哪種語言有這樣的功能? – 2017-05-02 15:07:43

+0

@IvankaTodorova Swift呢! – 2017-11-22 23:06:17

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; 
     } 
    } 
} 
相關問題