我已经设置了我的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)
答案 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())