我已经设置了我的 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)
Run Code Online (Sandbox Code Playgroud)
小智 5
这是因为 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>)
Run Code Online (Sandbox Code Playgroud)
我建议坚持使用 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)
Run Code Online (Sandbox Code Playgroud)
django.utils.timezone:了解 UTC 时区。
>>>timezone.now()
datetime.datetime(2018, 1, 18, 13, 31, 16, 349259, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud)
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>)
Run Code Online (Sandbox Code Playgroud)
由于 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,
)
Run Code Online (Sandbox Code Playgroud)
关于处理日期和时间的其他有趣材料。 http://pytz.sourceforge.net https://docs.python.org/3/library/datetime.html
| 归档时间: |
|
| 查看次数: |
2593 次 |
| 最近记录: |