0

私はPythonの日付比較を行っています:

次のような日付があるとします。'Fri Aug 17 12:34:00 2012 +0000'

次の方法で解析しています。

dt=datetime.strptime('Fri Aug 17 12:34:00 2012 +0000', '%a %b %d %H:%M:%S %Y +0000')

ドキュメントページで残りの処理方法を見つけることができませんでした+0000か? ハードコードされた値よりも一般的なソリューションが必要です。

おそらくこれは非常に簡単ですが、何かヒントはありますか?

4

3 に答える 3

5

デフォルトのdatetimeモジュールはタイムゾーンをうまく処理しません。現在のマシンのタイムゾーンと UTC を超えるものは、基本的にサポートされていません。

そのために外部ライブラリを使用するか、タイムゾーンオフセットを手動で処理する必要があります。

外部ライブラリ オプション:

  • Use を使用すると、使用dateutil.parserしたいほぼすべての日付や時刻の形式を処理できます。

    from dateutil import parser
    
    dt = parser.parse(s)
    
  • iso8601ライブラリは、同じ形式のタイムゾーン オフセットを含む ISO 8601 形式のみを処理します。

    import iso8601
    datetimetext, tz = s.rsplit(None, 1)  # only grab the timezone portion.
    timezone = iso8601.iso8601.parse_timezone('{}:{}'.format(tz[:3], tz[3:]))
    dt = datetime.strptime(datetimetext, '%a %b %d %H:%M:%S %Y').replace(tzinfo=timezone)
    

各アプローチのデモンストレーション:

>>> import datetime
>>> s = 'Fri Aug 17 12:34:00 2012 +0000'
>>> import iso8601
>>> timezone = iso8601.iso8601.parse_timezone('{}:{}'.format(tz[:3], tz[3:]))
>>> datetime.datetime.strptime(datetimetext, '%a %b %d %H:%M:%S %Y').replace(tzinfo=timezone)
datetime.datetime(2012, 8, 17, 12, 34, tzinfo=<FixedOffset '+00:00'>)
>>> from dateutil import parser
>>> parser.parse(s)
datetime.datetime(2012, 8, 17, 12, 34, tzinfo=tzutc())
于 2013-02-19T13:45:00.630 に答える
3

デロリアンも見てみたいかもしれません。これは両方のラッパーであり、タイムゾーン操作pytzdateutil簡単な日時タイムゾーンシフトを提供します。

デロリアンであなたの質問を解決する方法は次のとおりです。

>>> from delorean import parse
>>> parse("2011/01/01 00:00:00 -0700")
Delorean(datetime=2011-01-01 07:00:00+00:00, timezone=UTC)

そこから、.datetime属性を返すだけで日時を返すことができます。タイムシフトをしたい場合は、単純にデロリアン オブジェクトを使用して、.shift("UTC")などを行います。

于 2013-02-21T05:59:05.433 に答える
1

次を使用しdateutil.parserます。

>>> import dateutil.parser
>>> dateutil.parser.parse('Fri Aug 17 12:34:00 2012 +0000')
>>> datetime.datetime(2012, 8, 17, 12, 34, tzinfo=tzutc())
于 2013-02-19T13:46:34.520 に答える