2011-02-23 36 views
12

我需要在PHP腳本中比較(實際排名/排序)日期。日期是ISO-8601格式的日期即比較PHP中的兩個ISO8601日期字符串

YYYY-MM-DD

我寫了分裂的日期和年/月/日比較的比較功能。但是,似乎這可能是矯枉過正,我可以很容易地做這樣一個簡單的字符串比較:

if ($date1 < $date2) 
    // do something 
elseif($date1 > $date2) 
    //do something else 
else 
    //do yet another thing 

是我講的假設(ISO-8601)日期字符串比較正確的 - 即我可以擺脫我的功能(爲了節省服務器上的幾個時鐘週期),還是明確地在自定義函數中進行比較更安全?

回答

19

http://en.wikipedia.org/wiki/ISO_8601#General_principles

的日期和時間值從最高到最低顯著組織。該表示的字典順序因此對應於時間順序,除了涉及負數年份的日期表示之外。這允許日期自然地由例如文件系統排序。

繼續進行字符串排序。如果維基百科不夠用,那麼當然是http://www.ietf.org/rfc/rfc3339.txt,那裏搜索strcmp。

+2

+1 RFC參考,儘管您應該也許已經列出了注意事項。 *「假設日期和時間的時間段 是相同的(例如,所有以UTC表示), 使用相同的字符串(例如,所有」Z「或全部」+00:00「)和 時間具有相同數量的小數第二位數,則日期和時間字符串可以按字符串排序(例如,使用C)中的 strcmp()函數「* – Manav

7

如果你把你的日期變成DateTime objects(通常從PHP 5.2+開始),你可以可靠地使用比較而不管格式。年,月(或周),日,小時,分鐘,秒和第二的分數:

$date = new DateTime("YYYY-MM-DD"); 
$date2 = new DateTime("YYYY-MM-DD"); 

if ($date > $date2) ..... 
2

如果您至少有PHP 5.2,我會推薦Pekka's answer。如果這不是一種選擇,你可以將日期轉換爲數字和數字進行比較:

if(strtotime('YYYY-MM-DD') > strtotime('YYYY-MM-DD')) 
{ 
    // code 
} 

編輯:

由於Maerlyn在評論中指出,Unix的時代有一個有限的範圍內。如果你都保證零中的1位數的月和日期前,你還可以使用strcmp

if(strcmp('2011-05-04', '2011-04-05') > 0) 
{ 
    // First date is larger 
} 
+0

關於PHP版本的好處。 –

+0

你只需要記住unix時間戳的範圍(1970-2038)。 – Maerlyn

+0

我不認爲與strcmp比較實際工作。我們有一些缺陷。我寧願依靠比較真正的日期或毫秒,然後希望得到一些字符串魔法。 –

3

如果您在ISO有兩個日期8601格式,那麼,是的,你可以比較它們作爲字符串。此解決方案具有最佳性能:

Test name  Repeats   Result   Performance  
string   10000   0.031393 sec +0.00% 
strcmp   10000   0.040579 sec -29.26% 
strtotime  10000   0.149791 sec -377.15% 
DateTime  10000   0.184489 sec -487.68% 

測試來源here