日付を表す文字列テキストがあり、それを完全に解析し、きれいな日時オブジェクトに変換できます。
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'にはこのような問題がないことを明確にしています
dateutil モジュールを使用してGST時刻形式文字列を[ここに示すとおり] [4]に変換してから tzinfoをdatetimeオブジェクトに を挿入することにより、次の回避策を完全に作成できます。
しかし、今後のプロジェクトには明らかに%zパターンが必要なので、この回避策を回避し、この単純なタスクに外部モジュールを使用する解決策を見つけたいと思います。読んでみてください。 python(私は2.7にいます)の新しいバージョンはそれを処理できると思っていましたが、この小さいながらも重要な詳細のために現在のバージョンを変更したくないです。
さて、コメントを見ると、ロケール時間を意識せずにstrptime()を使用して電子メールのタイムゾーンインジケーターを解析する方法を再構成できますか?
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タイムゾーン文字列を使用して日付を解析する方法?
@ 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'))
ウリの答えは素晴らしい、私の命を救ったが、あなたが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)