web-dev-qa-db-ja.com

日時オブジェクトがpytzでローカライズされているかどうかを確認する方法は?

ローカライズされた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)
53
chiborg

ローカライズが必要かどうかを判断するにはどうすればよいですか?

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() 方法)。

80
jfs

日時オブジェクト「d」がローカライズされているかどうかを確認する場合は、d.tzinfoを確認します。Noneの場合はローカライズされていません。

23
Cédric Julien

以下は、一番の答えをまとめる関数です。

def tz_aware(dt):
    return dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None
2
Derek R.

タイムスタンプ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条件であり、それなしでは、すべての単純なケースが関数によってキャッチされるわけではありません。

2
eiTan LaVi