ローカライズされたUTCタイムゾーンで日時オブジェクトを保存したい。日時オブジェクトを格納するメソッドには、ローカライズされていない日時(ナイーブ)オブジェクトまたはすでにローカライズされているオブジェクトを指定できます。ローカライズが必要かどうかを判断するにはどうすればよいですか?
If条件がないコード:
class MyClass:
def set_date(self, d):
# what do i check here?
# if(d.tzinfo):
self.date = d.astimezone(pytz.utc)
# else:
self.date = pytz.utc.localize(d)
ローカライズが必要かどうかを判断するにはどうすればよいですか?
datetime
docs から:
日時オブジェクトd
は次の場合にのみ認識されます:
_d.tzinfo is not None and d.tzinfo.utcoffset(d) is not None
_
d
は単純な場合だけです:
_d.tzinfo is None or d.tzinfo.utcoffset(d) is None
_
d
がUTCタイムゾーンの時刻を表すdatetimeオブジェクトである場合、両方の場合に使用できます。
_self.date = d.replace(tzinfo=pytz.utc)
_
d
がタイムゾーンに対応しているか、素朴であるかに関わらず動作します。
注: TCオフセットが固定されていないタイムゾーンでdatetime.replace()
メソッドを使用しないでください (UTCタイムゾーンで使用しても構いませんが、そうでない場合はtz.localize()
方法)。
日時オブジェクト「d」がローカライズされているかどうかを確認する場合は、d.tzinfoを確認します。Noneの場合はローカライズされていません。
以下は、一番の答えをまとめる関数です。
def tz_aware(dt):
return dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None
タイムスタンプobjをutcに変換または強制する、より完全な関数を次に示します。例外に達すると、タイムスタンプがローカライズされていないことを意味します。コード内で常にUTCで作業することをお勧めしますので、この関数は永続性からエントリレベルで非常に便利です。
def convert_or_coerce_timestamp_to_utc(timeobj):
out = timeobj
try:
out = timeobj.astimezone(pytz.utc) # aware object can be in any timezone
except (ValueError,TypeError) as exc: # naive
out = timeobj.replace(tzinfo=pytz.utc)
return out
J.F. Sebastianの回答にある「try catch」からの小さな追加は、追加のcatch条件であり、それなしでは、すべての単純なケースが関数によってキャッチされるわけではありません。