web-dev-qa-db-ja.com

Python datetime.strptime()のタイムゾーン '%z'ディレクティブは利用できません

Datetime.strptime()の '%z'パターンを使用する

日付を表す文字列テキストがあり、それを完全に解析し、きれいな日時オブジェクトに変換できます。

date = "[24/Aug/2014:17:57:26"
dt = datetime.strptime(date, "[%d/%b/%Y:%H:%M:%S")  

timezone で指定された%zパターンを使用して日付文字列全体をキャッチできないことを除いて here

date_tz = 24/Aug/2014:17:57:26 +0200
dt = datetime.strptime(date, "[%d/%b/%Y:%H:%M:%S %z]")
>>> ValueError: 'z' is a bad directive in format '[%d/%b/%Y:%H:%M:%S %z]'

このバグレポート が言うように

strftime()はプラットフォームごとに実装されます

ナイーブなtzinfoディレクティブ '%Z'にはこのような問題がないことを明確にしています

回避策:tzinfo文字列をtzinfoオブジェクトにキャストします

dateutil モジュールを使用してGST時刻形式文字列を[ここに示すとおり] [4]に変換してから tzinfoをdatetimeオブジェクトに を挿入することにより、次の回避策を完全に作成できます。

質問:プレートフォームで%zを使用可能にしますか?

しかし、今後のプロジェクトには明らかに%zパターンが必要なので、この回避策を回避し、この単純なタスクに外部モジュールを使用する解決策を見つけたいと思います。読んでみてください。 python(私は2.7にいます)の新しいバージョンはそれを処理できると思っていましたが、この小さいながらも重要な詳細のために現在のバージョンを変更したくないです。

[編集]

さて、コメントを見ると、ロケール時間を意識せずにstrptime()を使用して電子メールのタイムゾーンインジケーターを解析する方法を再構成できますか?

16
c24b

strptime()は純粋なPythonで実装されていますstrftime();とは異なりit [サポートされているディレクティブ]はプラットフォームに依存しません。 %zは、Python 3.2:

>>> from datetime import datetime
>>> datetime.strptime('24/Aug/2014:17:57:26 +0200', '%d/%b/%Y:%H:%M:%S %z')
datetime.datetime(2014, 8, 24, 17, 57, 26, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))

ロケール時間を意識せずにstrptime()を使用して電子メールタイムゾーンインジケーターを解析する方法

Python 2.7に具体的なタイムゾーンの実装はありません。UTCオフセット解析を簡単に実装できます。 pythonで-0400タイムゾーン文字列を使用して日付を解析する方法?

21
jfs

@ j-f-sebastiansの回答を続けるには、python 2.7

代わりに:

datetime.strptime(t,'%Y-%m-%dT%H:%M %z')

timedeltaを使用して、次のようにタイムゾーンを説明します。

from datetime import datetime,timedelta
def dt_parse(t):
    ret = datetime.strptime(t[0:16],'%Y-%m-%dT%H:%M')
    if t[17]=='+':
       ret-=timedelta(hours=int(t[18:20]),minutes=int(t[20:]))
    Elif t[17]=='-':
       ret+=timedelta(hours=int(t[18:20]),minutes=int(t[20:]))
    return ret

print(dt_parse('2017-01-12T14:12 -0530'))
14
Uri Goren

ウリの答えは素晴らしい、私の命を救ったが、あなたがUSE_TZ = True時間に注意する必要があります。リターンにutcを追加する場合は、「RuntimeWarning:DateTimeField」という警告の方が適切です。

import pytz
from datetime import datetime, timedelta
def dt_parse(t):
    ret = datetime.strptime(t[0:19],'%Y-%m-%dT%H:%M:%S')
    if t[23]=='+':
        ret-=timedelta(hours=int(t[24:26]), minutes=int(t[27:]))
    Elif t[23]=='-':
        ret+=timedelta(hours=int(t[24:26]), minutes=int(t[27:]))
    return ret.replace(tzinfo=pytz.UTC)
0
LaBE