2012-05-01 9 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では、<オペレータが2つの数値を比較します。提示された値は、フック、詐欺、またはブルートフォースと無知によって数に強制されます。たとえば、if ("A" == "B")が真であるのは、"A"が数字として扱われるため、"B"です。日付/時刻文字列は、数値比較を使用する場合に限り、数値が年の構成要素であるかのように扱われます。 (そのニーモニック元のFortran比較演算子に基づくかもしれない:ltlegtgeeqne及びcmp

文字列比較演算子が文字列を比較するために使用されます。数値を比較するには、数値比較器(<,<=>>=!===および<=>)を使用します。比較の種類を区別するように注意してください。

+0

ありがとうジョナサン・レフラー!!!それは働いた.... – SWN

+0

Nit: "t"と "T"の両方が許可され、 "z"と "Z"の両方が許可されているので、それらを比較する前に文字列を 'uc'する必要があります。 – 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

あなたの日付は、(質問はこれを明示的に言及しなかった)同じ時間帯に必ずしもないている場合は、解析すると、日付文字列を自分で計算するよりも、専用の日付&時間モジュールを使用したほうが良いと思います。比較は文字列ベースの答えで文字列比較とは異なり、2つのオブジェクト間の数値比較を使用していることを

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"; 
} 

注:ここではDateTimeDateTime::Format::ISO8601モジュールを使用した例です。これは、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」となる。これを処理するパッケージを使用することは合理的です。 –

関連する問題