如何检查日期时间对象是否使用 pytz 本地化?

发布于 2024-11-03 17:43:53 字数 312 浏览 4 评论 0原文

我想存储具有本地化 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)

I want to store a datetime object with a localized UTC timezone. The method that stores the datetime object can be given a non-localized datetime (naive) object or an object that already has been localized. How do I determine if localization is needed?

Code with missing if condition:

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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

执手闯天涯 2024-11-10 17:43:54

如果要检查日期时间对象“d”是否已本地化,请检查 d.tzinfo,如果为 None,则没有本地化。

if you want to check if a datetime object 'd' is localized, check the d.tzinfo, if it is None, no localization.

很糊涂小朋友 2024-11-10 17:43:54

这是一个总结最佳答案的函数。

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

Here is a function wrapping up the top answer.

def tz_aware(dt):
    return dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None
笔芯 2024-11-10 17:43:54

这是一个更完整的函数,用于将时间戳 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

JF Sebastian 的答案中“try catch”的一个小补充是附加的 catch 条件,没有它,函数不会捕获所有幼稚的情况。

Here's a more complete function to convert or coerce a timestamp obj to utc. If it reaches the exception this means the timestamp is not localized. Since it's good practice to always work in UTC within the code, this function is very useful at the entry level from persistence.

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

The small addition from the 'try catch' in the answer by J.F. Sebastian is the additional catch condition, without which not all naive cases will be caught by the function.

与往事干杯 2024-11-10 17:43:53

如何确定是否需要本地化?

来自日期时间 文档

  • 日期时间对象d 是已知的当且仅当:

    d.tzinfo 不是 None 并且 d.tzinfo.utcoffset(d) 不是 None
    
  • d 是天真的 iff:

    d.tzinfo 为 None 或 d.tzinfo.utcoffset(d) 为 None
    

尽管如果 d 是表示 UTC 时区时间的日期时间对象,那么您可以在两种情况下使用:

self.date = d.replace(tzinfo=pytz.utc)

无论如何它都有效d 是时区感知的或天真的。

注意:不要将 datetime.replace() 方法与具有非固定 utc 偏移量的时区一起使用< /a> (可以将其与 UTC 时区一起使用,但否则您应该使用 tz.localize() 方法)。

How do I determine if localization is needed?

From datetime docs:

  • a datetime object d is aware iff:

    d.tzinfo is not None and d.tzinfo.utcoffset(d) is not None
    
  • d is naive iff:

    d.tzinfo is None or d.tzinfo.utcoffset(d) is None
    

Though if d is a datetime object representing time in UTC timezone then you could use in both cases:

self.date = d.replace(tzinfo=pytz.utc)

It works regardless d is timezone-aware or naive.

Note: don't use datetime.replace() method with a timezone with a non-fixed utc offset (it is ok to use it with UTC timezone but otherwise you should use tz.localize() method).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文