【问题标题】:How does Django Timezone Work?Django 时区如何工作?
【发布时间】:2015-12-24 01:31:53
【问题描述】:

所以,在我的设置中,我有以下内容:

LANGUAGE_CODE = 'en-us'

USE_I18N = True

USE_L10N = True

USE_TZ = True

TIME_ZONE = 'Europe/Copenhagen'

但是,当我发出:

timezone.now()
datetime.datetime(2015, 9, 26, 8, 47, 15, 862729, tzinfo=<UTC>)

而且时间晚了两个小时。

我正在阅读文档,我可以看到这个方法调用 datetime.datetime() 并且那里的信息是正确的。我可以看到输出基于设置为我当前位置的变量 TIME_ZONE。那么 timezone.now() 不应该得到正确的 TIME_ZONE 时间吗?

另一个问题:datetime.datetime() 是否从服务器获取信息?

【问题讨论】:

    标签: python django datetime timezone


    【解决方案1】:
    1. 是的,它从运行代码的机器获取信息。
    2. 不,它没有给你当地时间。不,它不使用您设置中的时区(doc refcode ref)。它使用 UTC 时间(Europe/Copenhagen 是 UTC+2)。
    3. 如果你想获取本地日期时间对象,你应该让它变得幼稚:

      timezone.make_naive(timezone.now(), timezone.get_current_timezone())  
      

    【讨论】:

    • 我已将 timezone.now 添加到我的 models.py 中,以便在某些类中标记修改时间。难道没有更好的办法吗?
    • 你为什么建议使用一个简单的日期时间对象?如果USE_TZ=Truetimezone.now().astimezone(timezone.get_current_timezone()) 返回当前时区的感知日期时间对象。虽然您不需要手动调用.astimezone();有timezone.localtime() 可以为您做这件事,如果USE_TZ=True 也不需要调用相应的模板过滤器(localtime
    【解决方案2】:

    时区感知日期时间的重要之处不是它们碰巧存储在哪个时区,而是它们代表一个时间点这一事实。如果这是真的,那么在您想要的任何时区显示日期时间都是微不足道的(好吧,可能,无论如何)。

    所以 Django 的工作方式是所有感知的日期时间都存储在 UTC 中。 (即便如此,它们可能会或不会以 UTC 从数据库返回,具体取决于数据库设置。)然后它为您提供工具(例如 TIME_ZONE 设置和 activate())来设置渲染时应使用的时区用户展示模板。

    所以你描述的一切都是设计的。它真的给你带来了问题吗?

    【讨论】:

    • 如果我在 settings.py 上设置我的时区,然后我调用 timezone.now(),它不应该返回正确的时间吗?正如我所提到的,它返回一个你之前的两个时间对象。
    • @E.Camilo:UTC 时间上午 8 点和欧洲/哥本哈根上午 10 点(夏令时)时间完全相同。所以这是正确的时间。 TIME_ZONE 设置告诉 Django 用户显示的默认时区,它不影响 Python 对象中使用的时区。如果你真的想转换它,你可以(参见#2 here),但这是一个不常见的用例。
    • 我想当我将时区设置为“欧洲/哥本哈根”时,时区参考会自动设置为 UTC+2。这就是让我感到困惑的原因。
    猜你喜欢
    • 2020-12-02
    • 2016-01-19
    • 2016-11-28
    • 2013-11-05
    • 2011-07-06
    • 2013-02-10
    • 2012-12-01
    • 2012-09-28
    • 1970-01-01
    相关资源
    最近更新 更多