【问题标题】:Timezone.now() vs datetime.datetime.now()Timezone.now() 与 datetime.datetime.now()
【发布时间】:2015-01-13 00:33:19
【问题描述】:

什么时候应该使用django的timezone.now(),什么时候应该使用python的datetime.datetime.now()。

例如,在下面的INSERT 中哪个更有意义?

- Product.objects.create(title='Soap', date_added=datetime.datetime.now())
- Product.objects.create(title='Soap', date_added=timezone.now())

是否有关于何时使用每种方法的经验法则?

【问题讨论】:

标签: python django datetime django-timezone


【解决方案1】:

始终使用timezone.now()。 Django 现在有时区支持,需要时区“感知”日期时间对象。 datetime.now() 将返回一个时区朴素对象,而 timezone.now() 将返回一个时区感知对象。

Read more about Django timezones

【讨论】:

  • 更准确地说,timezone.now() 将根据USE_TZ 设置返回一个幼稚或有意识的datetime。
  • 你能给我指出一个我可以了解更多关于每一个的资源吗?
  • 那个 django 1.9 链接坏了,所以我添加了一个指向当前稳定文档的链接
【解决方案2】:

如果你想使用 UTC,并且你使用的是 Python 3.2 或更高版本,this answer 说你可以这样做:

import datetime
datetime.datetime.now(datetime.timezone.utc)

这将为您提供一个时区感知的 UTC 日期时间。

【讨论】:

    【解决方案3】:

    可以用shell写,例如:

    timezone.datetime.now() < timezone.now() 
    

    错误信息是:

    TypeError: can't compare offset-naive and offset-aware datetimes
    

    它们是不同的对象,只有 timezone.now() 支持 UTC

    【讨论】:

    • 您能否详细说明 UTC 支持的含义?
    • 来自 Django 文档:Python 的 datetime.datetime 对象具有 tzinfo 属性,可用于存储时区信息,表示为 datetime.tzinfo 子类的实例。当设置此属性并描述偏移量时,日期时间对象是可识别的。否则就太天真了。
    • “只有 timezone.now() 有 UTC 支持”意思是“只有 timezone.now() 有 tzinfo 属性”
    猜你喜欢
    • 2012-06-02
    • 2023-03-19
    • 2020-10-04
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多