【问题标题】:DJANGO timezone setting and auto_now result are differenceDJANGO 时区设置和 auto_now 结果不同
【发布时间】:2018-06-27 09:15:41
【问题描述】:

我已经设置了我的 django,并且我有一个 auto_now=True 的模型,因为我的 SQL 服务器时区已设置为“亚洲/上海”,所以我也想将 django 设置为这个时区。我已将其设置为 TIME_ZONE='Asia/Shanghai' 和 Use_TZ=True。

我检查了 datetime.datetime.now() 可以给我正确的时区时间。但是 django.utils.timezone.now() 时间仍然是 UTC 时间,如下面的 shell 输出所示。

我认为这可以解释为什么我的 auton_now 对象时区始终采用 UTC。我打算在 models.py 中设置默认使用我的 datetime.datetime.now() 对象,但我对此有警告。

如何设置 settings.py 以便 django.utils.timezone 对象也可以正确设置?

>>> timezone.get_current_timezone()
<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>
>>> timezone.now()
datetime.datetime(2018, 1, 18, 10, 11, 0, 936572, tzinfo=<UTC>)
>>>
>>> datetime.datetime.now()
datetime.datetime(2018, 1, 18, 18, 20, 23, 722825)

【问题讨论】:

    标签: django


    【解决方案1】:

    这是因为 django 默认将其日期保存为 UTC,它这样做是因为 UTC 最容易操作到不同的时区。如果您想在使用 timezone.now() 时引用您的时区,请查看文档。

    如何获取当前时区的当地时间?

    嗯,第一个问题是,你真的需要吗?

    您应该只在与人类交互时使用本地时间,并且模板层提供过滤器和标签以将日期时间转换为您选择的时区。

    此外,Python 知道如何比较感知的日期时间,并在必要时考虑 UTC 偏移量。用 UTC 编写所有模型和视图代码要容易得多(并且可能更快)。因此,在大多数情况下,django.utils.timezone.now() 返回的 UTC 日期时间就足够了。

    不过,为了完整起见,如果您真的想要当前时区的当地时间,您可以通过以下方式获取它:

    >>> from django.utils import timezone
    >>> timezone.localtime(timezone.now())
    datetime.datetime(2012, 3, 3, 20, 10, 53, 873365, tzinfo=<DstTzInfo 'Europe/Paris' CET+1:00:00 STD>)
    

    我建议坚持使用 UTC,并在旅途中转换您的时间。
    有关如何执行此操作的更多信息,请阅读此https://docs.djangoproject.com/en/1.11/topics/i18n/timezones/

    只是补充一下 Django 在使用 datetime.datetime.now() 时发出警告的原因是因为它是一个幼稚的时间(不是时区 知道/缺少 tzinfo attr)。 比如

    datetime:原始时间(不知道时区)。

    >>>datetime.datetime.now()
    datetime.datetime(2018, 1, 18, 21, 31, 16, 349259)
    

    django.utils.timezone:了解 UTC 时区。

    >>>timezone.now()
    datetime.datetime(2018, 1, 18, 13, 31, 16, 349259, tzinfo=<UTC>)
    

    django.utils.timezone:了解当地时区

    >>>timezone.localtime(timezone.now())
    datetime.datetime(2018, 1, 18, 21, 31, 16, 349259, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
    

    由于 django 使用这些设置设置了 auto_now

    按照目前的实施,将 auto_now 或 auto_now_add 设置为 True 将导致该字段设置为 editable=False 和 blank=True。

    如果您打算模仿 django 的 DateTimeField 行为,我建议您像这样设置您的字段。

    from django.utils import timezone
    
    pub_date = models.DateTimeField(
        default=timezone.localtime(timezone.now()),
        editable=False,
        blank=True,
        )
    

    有关处理日期和时间的其他有趣材料。 http://pytz.sourceforge.net https://docs.python.org/3/library/datetime.html

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      from django.utils import timezone
      timezone.localtime(timezone.now())
      

      https://stackoverflow.com/a/16037255/15553557

      【讨论】:

        猜你喜欢
        • 2010-12-16
        • 2016-04-05
        • 1970-01-01
        • 1970-01-01
        • 2021-04-20
        • 2018-02-01
        • 2018-12-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多