22

以前の質問Python time to ageに続いて、タイムゾーンに関する問題に遭遇しましたが、常に「+0200」になるとは限らないことがわかりました。そのため、strptime がそのように解析しようとすると、例外がスローされます。

[:-6] などで +0200 を切り取ることを考えましたが、strptime でこれを行う実際の方法はありますか?

問題がある場合は、Python 2.5.2 を使用しています。

>>> from datetime import datetime
>>> fmt = "%a, %d %b %Y %H:%M:%S +0200"
>>> datetime.strptime("Tue, 22 Jul 2008 08:17:41 +0200", fmt)
datetime.datetime(2008, 7, 22, 8, 17, 41)
>>> datetime.strptime("Tue, 22 Jul 2008 08:17:41 +0300", fmt)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/_strptime.py", line 330, in strptime
    (data_string, format))
ValueError: time data did not match format:  data=Tue, 22 Jul 2008 08:17:41 +0300  fmt=%a, %d %b %Y %H:%M:%S +0200
4

5 に答える 5

18

dateutil非常に便利なライブラリを使用できます。

from datetime import datetime
from dateutil.parser import parse

dt = parse("Tue, 22 Jul 2008 08:17:41 +0200")
## datetime.datetime(2008, 7, 22, 8, 17, 41, tzinfo=tzoffset(None, 7200)) <- dt

print dt
2008-07-22 08:17:41+02:00
于 2009-03-12T14:48:06.807 に答える
0

%Z はオフセットではなくタイムゾーン名に対応しているようです。

たとえば、次のようになります。

>>> format = '%a, %d %b %Y %H:%M:%S %Z'

解析できます:

>>> datetime.datetime.strptime('Tue, 22 Jul 2008 08:17:41 GMT', format)
datetime.datetime(2008, 7, 22, 8, 17, 41)

タイムゾーンについては何もしていないように見えますが、タイムゾーンが存在し、有効であることを確認するだけです:

>>> datetime.datetime.strptime('Tue, 22 Jul 2008 08:17:41 NZDT', format)
datetime.datetime(2008, 7, 22, 8, 17, 41)

必要に応じて、オフセットから名前へのマッピングを見つけ、入力を変換してから解析することもできます。ただし、入力を切り捨てる方が簡単かもしれません。

于 2009-02-08T23:23:29.240 に答える