2009-05-31 6 views
2

私はRubyライブラリのコードをリファクタリングしています。このコードには日付パーサーが含まれています。 テストの1つはISO 8601とされているこの文字列 "2008-02-20T8:05:00-010:00"を解析することでした。正しいISO 8601フォーマット

上記のコードは実際に出力されます: "Wed Feb 20 18:05:00 UTC 2008"。 私の新しいコードでは、「Wed Feb 20 16:05:00 UTC 2008」と出力されます。

私の質問は、どちらが正しいですか?

Time.parse Rubyで2番目のものがあります。しかし、前回のコードとテストがバグだったことを100%確信したいと思います。

どちらが正しいですか? (おそらく別の言語のライブラリで文字列を解析することによって - 私はRubyしか知りません)

+0

おそらく、暗黙的に使用されるタイムゾーンが原因ですか。 –

+0

多分...私は知らない! –

答えて

2

正しいUTC時間は1805です。時間グループは、ゾーン-10で0805を示しています。与えられた時間。したがって、1805。1805は2400未満であるため、同じ日です。

コードで1605が指定されている場合、ほとんどの場合、タイムゾーンがゾーン-8に誤って設定されていることがあります。これは太平洋標準時です。


あなたの入力フォーマットがうんざりしているようです。観察:

irb(main):003:0> Time.parse("2008-02-20T8:05:00-010:00") 
=> Wed Feb 20 08:05:00 -0700 2008 

私はゾーン-7にいるので、それは私のロケールに合っています。しかし、

irb(main):004:0> t=Time.parse("2008-02-20T8:05:00-010:00") 
=> Wed Feb 20 08:05:00 -0700 2008 
irb(main):005:0> t 
=> Wed Feb 20 08:05:00 -0700 2008 
irb(main):006:0> t.getutc 
=> Wed Feb 20 15:05:00 UTC 2008 

私は予期せぬ結果を得ています。今観察:

irb(main):007:0> t=Time.parse("2008-02-20T8:05:00-10:00") 
=> Wed Feb 20 11:05:00 -0700 2008 
irb(main):008:0> t.getutc 
=> Wed Feb 20 18:05:00 UTC 2008 

期待結果があります。違いを見ます?二対最初の例:

irb(main):004:0> t=Time.parse("2008-02-20T8:05:00-010:00") 
irb(main):007:0> t=Time.parse("2008-02-20T8:05:00-10:00") 

私は偽の余分な0アウト(私は確かにどちらか気づかなかった)とヒューという音を取り、それが動作します。

+0

はい、私は実際にPST(サンフランシスコ)にいます。それはRubyのTime.parseが私に失敗するということですか? –

+1

いいえ、時間が正しく設定されていることを意味しますが、ローカルタイムゾーンで出力しています。ゾーン-10 *の1805はゾーン-8の* 1605です。 –

+0

まあ、出力はUTCの両方で表示されます。 "Wed Feb 20 18:05:00 UTC 2008" "Wed Feb 20 16:05:00 UTC 2008" これらは両方とも正しいことはできません。 ? –

0

私はこれがかなり古いことを知っていますが、私はちょうどそれを渡った。

私は値8と数はおそらくそれがTime.parse()の実装にバグだと何かがどこか010を解釈していることを賭けますか?

+0

これも私の最初の考えでした。標準(ウィキペディア版:http://en.wikipedia.org/wiki/ISO_8601#Time_zone_designators)を読むと、時間オフセットは2桁に制限されます。私は本当に3が有効と考えられているとは思わないし、それが全く解析されないという事実はバグとみなされるべきである。また、今年は02013が有効なISO 8601表記法であり、ここでは8進数の解釈は望ましくありません。 – toddkaufmann