2012-05-01 54 views

回答

9

ISO 8601符號,你表現出的巨大優勢是,它可以用字符串比較來比較:

my $v1 = "2011-12-14T17:22:52Z"; 
my $v2 = "2012-01-03T19:13:49Z"; 

print "$v1 earlier than $v2\n" if $v1 lt $v2; 

這是假設的數值都在祖魯時間(Z是時區,又稱UTC) 。如果你有不同的時區,那麼你需要規範化到一個時區(UTC是一個明智的選擇),然後進行比較。


請仔細注意術語'string comparison'

在Perl中,<運算符比較兩個數字。所呈現的價值觀將被鉤,騙子或蠻力和無知強迫成一個數字。例如,if ("A" == "B")爲真,因爲"A"被視爲數字,爲0,因此"B"也是如此。只有在使用數字比較時,日期/時間字符串纔會被視爲數字是年份組分。

字符串比較操作(其助記符可能會在原有基礎上的Fortran比較運算符:ltlegtgeeqnecmp)用於比較字符串。您可以使用數字比較器(<,<=,>,>=,!=,==<=>)來比較數字。要小心區分你想要做的比較類型。

+0

謝謝Jonathan Leffler !!!它的工作.... – SWN

+0

Nit:你需要比較它們之前的'uc'字符串,因爲允許「t」和「T」,並且允許「z」和「Z」。 – ikegami

+0

注意:該特定格式稱爲RFC 3339.除Atom僅允許大寫「T」和「Z」外,它由Atom(等)使用。用於DateTime的解析器和格式化程序:[DateTime :: Format :: RFC3339](http://search.cpan.org/perldoc?DateTime::Format::RFC3339),[DateTime :: Format :: Atom](http:/ /search.cpan.org/perldoc?DateTime::Format::Atom) – ikegami

2

如果您的日期不一定在同一時區(這個問題沒有明確提到這一點),那麼你會更好使用比分析和自己的計算日期字符串專用日期&時間模塊。下面是一個使用DateTimeDateTime::Format::ISO8601模塊的例子:

use DateTime::Format::ISO8601; 

my $dt1 = DateTime::Format::ISO8601->parse_datetime('2011-12-14T17:22:52Z'); 
my $dt2 = DateTime::Format::ISO8601->parse_datetime('2011-12-14T17:22:52+01:00'); 

if ($dt1 < $dt2) { 
    print "$dt1 is first\n"; 
} else { 
    print "$dt2 is first\n"; 
} 

注意,比較使用兩個物體之間的數字比較,不像在基於字符串的答案比較。這是因爲DateTime重載了比較運算符和字符串插值「運算符」。

+0

查看問題的一種方法是包含樣本日期Z'(祖魯時間或UTC)時區指定,並且因爲這通常不被人們使用,除非他們是技術人員(例如,我有時使用它),日期(可能)都在同一時區,而且時區是UTC。儘管如此,如果時區確實不一樣,那麼簡單的字符串比較是不夠的。例如,「2015-01-01T04:30:00 + 12:00」早於「2014-12-31T14:28:00-08:00」 - 前者對應於「2014-12-31T20:30: 00Z',後者爲'2014-12-31T22:28:00Z'。使用包來處理這是明智的。 –

相關問題