gpt4 book ai didi

DJANGO 时区设置和 auto_now 结果不同

转载 作者:行者123 更新时间:2023-12-03 22:18:53 27 4
gpt4 key购买 nike

我已经设置了我的 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 默认将其日期保存为 UTC,这样做是因为 UTC 最容易操作到不同的时区。如果您想在使用 timezone.now() 时引用您的时区,请查看文档。

How can I obtain the local time in the current time zone?

Well, the first question is, do you really need to?

You should only use local time when you’re interacting with humans, and the template layer provides filters and tags to convert datetimes to the time zone of your choice.

Furthermore, Python knows how to compare aware datetimes, taking into account UTC offsets when necessary. It’s much easier (and possibly faster) to write all your model and view code in UTC. So, in most circumstances, the datetime in UTC returned by django.utils.timezone.now() will be sufficient.

For the sake of completeness, though, if you really want the local time in the current time zone, here’s how you can obtain it:

>>> 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.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

As currently implemented, setting auto_now or auto_now_add to True will cause the field to have editable=False and blank=True set.


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

pub_date = models.DateTimeField(
default=timezone.localtime(timezone.now()),
editable=False,
blank=True,
)
关于处理日期和时间的其他有趣 Material 。
http://pytz.sourceforge.net
https://docs.python.org/3/library/datetime.html

关于DJANGO 时区设置和 auto_now 结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48318928/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com