我在尋找ISO格式—比較兩個日期(從文件動態接收),例如, 2011-12-14T17:22:52Z
— in Perl。我該怎麼做?在Perl中,如何比較ISO格式中的日期和時間(%Y-%m-%dT%H:%M:%SZ)?
回答
的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比較運算符:lt
,le
,gt
,ge
,eq
,ne
和cmp
)用於比較字符串。您可以使用數字比較器(<
,<=
,>
,>=
,!=
,==
和<=>
)來比較數字。要小心區分你想要做的比較類型。
如果您的日期不不一定在同一時區(這個問題沒有明確提到這一點),那麼你會更好使用比分析和自己的計算日期字符串專用日期&時間模塊。下面是一個使用DateTime和DateTime::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
重載了比較運算符和字符串插值「運算符」。
查看問題的一種方法是包含樣本日期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'。使用包來處理這是明智的。 –
- 1. Bash循環遍歷日期時間+%Y-%m-%d%H:%M格式
- 2. 以格式d/m/Y-H驗證日期和時間:i:s?
- 3. 如何在時間序列數據中將y%m%d%H格式轉換爲「%Y%m%d%H:%M:%S」
- 4. Python ValueError:時間數據'日期'與格式'%Y /%m /%d%H:%M:%S.%f'
- 5. Python ValueError:時間數據不符合格式'%H:%M%d /%m /%Y'
- 6. 計算比較sql時間戳和php日期(「y-m-d h:i:s」)
- 7. 比較日期(「Y-m-d h:i:s」);
- 8. 通過T-SQL將SQL Server日期時間格式化爲%Y-%m-%d%H:%M:%OS4%z格式?
- 9. 如何在php中將時間格式從M-d-Y更改爲Y-M-d?
- 10. 將日期格式從d-m-Y轉換爲Y-m-d
- 11. 將日期格式從d/m/Y更改爲Y-m-d
- 12. VBA將日期格式從D-M-Y更改爲M-D-Y
- 13. 格式日期爲PHP m/d/y至Y-m-d?
- 14. 轉換日期爲 「%Y%M%d%H%M%S」 在大熊貓
- 15. 格式創建的文本對象日期Y-M-d H:我:■
- 16. 如何在M/Y格式中獲得6個月的日期?
- 17. 如何在matplotlib中以'%H:%M'格式繪製y軸上的時間?
- 18. 碳日期格式 'd/M/Y H:我A'
- 19. 從格式Y-m-d創建JS日期類H:我:s
- 20. 如何轉換「Y/M/d H:我A」格式的日期和時間時間戳
- 21. 奇怪的日期和時間在Wordpress中格式化%Y /%m /%d
- 22. 在R studio中使用Y-M-D h-m-s時間戳過濾日期但不是時間?
- 23. 更改日期格式d-M-Y
- 24. ValueError:時間數據「['140209/1729']」與格式不匹配'%y%m%d /%H%M'
- 25. 計算日期格式的時間差('d/M/y H:i:s A')
- 26. 在pandas中混合日期格式dd/mm/yyyy和d/m/y
- 27. 如何將結果/ bin /日期「%Y-%m-%d%H:%M:%S」轉換爲秒?
- 28. NoMethodError(undefined method`year'for「%m /%d /%Y%H:%M」:String)
- 29. 將Julian日期與時間(H/m/s)轉換爲日期C#中的時間
- 30. mysql更新日期格式的表值%d-%m-%y到%y-%m-%d
謝謝Jonathan Leffler !!!它的工作.... – SWN
Nit:你需要比較它們之前的'uc'字符串,因爲允許「t」和「T」,並且允許「z」和「Z」。 – ikegami
注意:該特定格式稱爲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