2012-05-08 91 views
6

我將時間保存在數據庫中,如7:30 pm作爲varchar字段。我想檢查這個時間是否大於時間。PHP:如何比較時間字符串與日期('H:i')?

我轉換的DB時間字符串轉換成'19:30' ,現在我想要做這樣的事情:

$my_time = '19:30'; 

if($my_time > date('H:i')) 
{ 
    do something ... 
} 

的問題是上面會返回總是真,如果$ my_time非空字符串。

strtotime($my_time)也沒有幫助。

strtotime('H:i',$my_time)使它成爲00:00。

(int)date('H:i')將給1700年的實際時間是17:09,因此刪除冒號,然後比較不會太工作....

更改數據庫時的數據是毫無疑問的在這方面。

plz help。如果我說錯了一些事實,請糾正我。

+0

您應該使用本地日期時間字段而不是varchar。它會爲你解決這個問題。 –

+0

http://stackoverflow.com/questions/961074/how-do-i-compare-two-datetime-objects-in-php-5-2-8 –

+0

我知道約翰......這是最大的問題。 –

回答

7

您可以使用此:

$myTime = '19:30'; 
if (date('H:i') == date('H:i', strtotime($myTime))) { 
    // do something 
} 
+0

上的C:\ wamp \ www \ workspace \ bigbite \ index_parallel.php中出現意外字符它正常工作...謝謝 –

+0

m使用這個.. –

+4

很多時間已經過去了,但是和直接比較兩個字符串不一樣嗎?由於'date()'返回一個字符串,它就是這樣做的:'if(date('H:i')== '19:30')'不是嗎?,這與OP提到的是一樣的試。這是因爲'date('H:i',strtotime($ myTime))'返回原始的$ myTime值作爲字符串!所以它和'$ myTime'相同,而不是'date('H:i',strtotime($ myTime))'.so是什麼意思?我真的不明白。我錯過了什麼?爲什麼'if($ my_time> date('H:i'))'OP建議應該不起作用?因爲它對我有用。 – DiegoDD

2

不能像這樣的字符串使用比較運算符,因爲當你做字符串get converted to numbers first

對於一個班輪解決方案,您可以使用strcmp

if(strcmp($my_time, date('H:i')) == 1) 
{ 
    do something ... 
} 

以上的條件是語義上等同於「如果$ my_time大於當前時間」,但只有當的格式字符串保持一致!如果由於某種原因$my_time的格式不直接對應於H:i模式,在代碼中引入錯誤非常容易。

將值壓縮到字符串通常不是您應該使用日期和時間的方式。更合適的解決方案是使用PHP 5.2.0中引入的本地DateTime類(John Conde已經在his answer中給出了一個示例)。

但是,將時間視爲啞標量值也有一個可能的優點:結果與人類認爲01:00始終晚於00:00一致。 DateTime方法取決於當地的時區和日期,並可能不總是給你預期的結果。例如:

// assume we are in London 
date_default_timezone_set('Europe/London'); 

// assume that today is March 25, 2012 
$date1 = new DateTime("2012-03-25 01:00:00"); 
$date2 = new DateTime("2012-03-25 02:00:00"); 

// and... 
if ($date1 == $date2) { 
    echo "WTF?!? Equal???"; 
} 

See it in action

該測試的結果與比較「01:00」和「02:00」的一些標量表示的結果不同,所以最好考慮一下比較的正確語義。

+0

它的工作...與印度,加爾各答時區。我想我可以在現場服務器上使用它。 –

1
$date1 = DateTime::createFromFormat('H:i', $my_time1); 
$date2 = new DateTime(); 
if ($date1 > $date2) 
{ 
    // do something 
} 
+0

+1和強制免責聲明:根據當前日期和時區,特定值的測試結果可能會令人驚訝。 – Jon

+0

我收到以下錯誤:致命錯誤:帶有消息'DateTime :: __ construct()的未捕獲異常'異常'[datetime.--construct]:無法解析位置1(:)處的時間字符串(H:i):意外字符'in C:\ wamp \ www \ workspace \ bigbite \ index_parallel.php在線...................並且後面跟着警告:Exception:DateTime :: __ construct() [datetime.--construct]:無法解析位置1(:)處的時間字符串(H:i):在線 –

4

您可以建立一個新的DateTime對象,設置時間,日期隨機。比較這兩個對象。例如:

$my_time = new DateTime('January 1th 1970 19:30'); 
$comparable_time = new DateTime('January 1th 1970 '. date('H:i')); 
if($my_time < $comparable_time) { 
    // do something 
} else { 
    // do something else 
} 

請注意更改日誌;

Version 5.2.2 DateTime object comparison with the comparison operators changed to work as expected. Previously, all DateTime objects were considered equal (using ==).