这是因为 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