2

ISO 形式で 2 つの日付 (ファイルから動的に受信) を比較しようとしています - たとえば2011-12-14T17:22:52Z- Perl で。どうすればいいですか?

4

2 に答える 2

9

表示するISO8601表記の大きな利点は、文字列の比較と比較できることです。

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が賢明な選択です)、比較する必要があります。


'文字列比較'という用語に注意してください。

Perlでは、<演算子は2つの数値を比較します。提示された値は、フック、詐欺師、またはブルートフォースと無知によって強制されて数値になります。たとえば、if ("A" == "B")はtrueです。"A"これは、数値として扱われるのが0であり、。も同様であるためです"B"。日付/時刻の文字列は、数値比較を使用する場合にのみ、数値が年コンポーネントであるかのように扱われます。

文字列比較演算子(ニーモニックは元のFortran比較演算子に基づいている可能性があります:、、、、、、、および)は、文字列ltの比較に使用されます。数値コンパレータ(、、、、、、、および)を使用して数値を比較します。実行する比較のタイプを区別するように注意してください。legtgeeqnecmp<<=>>=!===<=>

于 2012-05-01T13:55:14.947 に答える
2

日付が必ずしも同じタイムゾーンにあるとは限らない場合(質問でこれについて明示的に言及されていません)、日付文字列を自分で解析して計算するよりも、専用の日付と時刻モジュールを使用する方がよいでしょう。以下は、 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";
}

文字列ベースの回答での文字比較とは異なり、比較では 2 つのオブジェクト間の数値比較が使用されることに注意してください。これは、比較演算子と文字列補間「演算子」をオーバーロードしているため機能します。DateTime

于 2012-05-01T17:58:58.817 に答える