2012-05-13 8 views
3

私はdateutilライブラリを使っていくつかの日付文字列を解析し、奇妙な結果を得ています。私は、次の日付文字列はすべて等しくなり仮定し、括弧内の時間帯省略形は、実際にはオプションだったことが、それは私に完全に異なる値を取得落下:Pythonで奇妙な日付の解析結果

import datetime 
import dateutil.parser 

parsed_d1 = dateutil.parser.parse('Sun May 13 2012 00:00:00 GMT-0400 (EDT)') 
parsed_d2 = dateutil.parser.parse('Sun May 13 2012 00:00:00 GMT-0400') 
parsed_d3 = dateutil.parser.parse('Sun May 13 2012 00:00:00-0400') 

print str(parsed_d1) 
print str(parsed_d2) 
print str(parsed_d3) 

を出力:

2012-05-13 00:00:00-04:00 
2012-05-13 00:00:00+04:00 
2012-05-13 00:00:00-04:00 

を誰でもここで何が起こっているのか説明できますか?

+0

最初のものと最後のものは同じなので、問題は2番目のものと異なるだけですか? – Levon

+0

正しい - 第2の問題は、あなたが使用している問題 – Yarin

+0

ですか? libのバグである可能性があります。バグ報告をチェックしましたか?私はこのタイプのPHPのlibで問題が発生したことを覚えています。タイムゾーンパーサーがバグだったことが判明しました – Philippe

答えて

3

EDTは、英国の西にある米国向けです。日は東から昇る。だから米国は英国では太陽が頭上にある。 GMTを取得するには、EDTに4時間を追加する必要があります。これが私が午後遅くに私の両親(英国)に電話をする必要がある理由、または彼らがベッドにいる理由です。言い換えれば:「EDT +4はGMTです」

今、このためのソースはhttp://bazaar.launchpad.net/~dateutil/dateutil/trunk/view/head:/dateutil/parser.pyであるとGMT-0400を解析に関連付けられているように見えるコメントがGMT-0400は「私の時間-4はGMTである」と同等であることを意味している

# Check for something like GMT+3, or BRST+3. Notice 
# that it doesn't mean "I am 3 hours after GMT", but 
# "my time +3 is GMT". If found, we reverse the 
# logic so that timezone parsing code will get it 
# right. 

言います。 ではなく、である。

また、コードを見ると、末尾(EDT)はの後にと処理されるため、優先されます。と私は最後の単純な-0400と3番目のケースが期待どおりに処理されると思う。

他の言葉で言えば、GMT-0400フォームはコードドキュメントとして機能していますが、期待通りには動作しません。 その行は他の2つと等価ではありません。

なぜこのコードがこのように動作するのかわかりません。私はちょうど私が読んだものを報告している。

最後に、このコードの一般的なアプローチは、日付文字列全体をチャンクで処理し、別の場所に異なるロジックを適用することです。異なる場所のロジックが一貫していることを確認するためのチェックがあまりありません(最初の行の見かけの矛盾に対してエラーはスローされません)。個人的には、Pythonの独自の日付解析ルーチンを使用するライブラリが好きですが、別のフォーマット文字列を試しています。

UPDATE私はこの記事について忘れていたが、この返事を書いた後、私は、タイムゾーンの解析を処理するためにsimple-dateを書いてしばらくした後。私は私が好むと言ったようにアプローチを取る - 巧みにしようとするのではなく、pytzデータベースを検索してマッチを探します。

+0

どのように醜いことができますか? – cacba

+0

@cacbaもしあなたがpython 3を使っているなら、単純化しようと書いたシンプルな日付を好むかもしれません。私が望むほど単純ではありませんが、問題は困難なものになります。 –

+0

私が来た結論は、この問題に対する一般的な解決策はなかったということでした。 ESTは2つのタイムゾーンです。日時解析が壊れています。 – cacba