DJANGO时区设置和auto_now结果不同

时间:2018-01-18 10:21:56

标签: django

我已经设置了我的django并且我有一个auto_now = True的模型,因为我的SQL服务器时区已经设置为'Asia / Shanghai',所以我想将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)

2 个答案:

答案 0 :(得分: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)。 E. g。

日期时间:天真时间(不知道时区)。

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

答案 1 :(得分:0)

你可以试试这个:

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

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