django 中的日期时间错误

Posted

技术标签:

【中文标题】django 中的日期时间错误【英文标题】:Datetime is wrong in django 【发布时间】:2020-07-06 21:03:20 【问题描述】:

我在东部标准时间 (EST)。夏令时开始于 2 周前,时钟拨快了 1 小时(所以下午 5 点变成了下午 6 点)。我有USE_TZ = True。 TIME_ZONE 设置为“EST”。

在我的应用中,我有一个提交日期的表单,例如凌晨 2 点。那个日期,仍然是凌晨 2 点,作为 DateTime 字段保存在模型中:event.start = date。我有一个呈现日期的视图,并且页面正确显示了凌晨 2 点。

问题:event.start 计算结果为凌晨 3 点(美国东部标准时间)/早上 8 点(世界标准时间),1 小时后应该是这样!输入是 2AM,它甚至在模板中呈现 2AM,但由于某种原因,event.start 在内部是 8AM (UTC) / 3AM (EST)。

但由于某种原因,django.utils.timezone.now() 给了我正确的时间凌晨 2 点,而不是凌晨 3 点。我的操作系统系统时间也给出了正确的时间,凌晨 2 点。我想在凌晨 2 点安排一个工作,但它最终被安排在凌晨 3 点,因为 event.start 出于某种原因被设置为凌晨 3 点!

我想保持 UTC 时间。我该如何处理?

【问题讨论】:

提供更多信息会有所帮助 - 列的确切类型是什么,您是否将 TIME_ZONE 设置为正确的位置? @Jindra 好的,我添加了该信息。希望对解决问题有所帮助 【参考方案1】:

Eastern Standard Time 没有夏令时,它与 UTC 硬偏移。当有夏令时时,位置从Eastern Standard Time 切换到Eastern Daylight Time(EDT)。

更多信息:https://www.timeanddate.com/time/zones/est

使用 Olson 标识符通常是更好的解决方案。它们是 IANA 时区数据库中使用的标识符。它们是基于位置的,因此当位置更改时区(包括夏令时)时,一切仍然有效。

改变 EST EDT 的地方示例:

America/New_York

尝试将 TIME_ZONEEST 更改为所需位置的 Olson 标识符。

【讨论】:

那么对于其他时区的用户来说,这仍然会中断吗?有没有办法自动获取用户的 Olson 标识符并将它们附加到他们提交表单的日期,或者 Django 是否已经这样做了? 取决于您所说的“中断”是什么意思。就好像每个人都在America/New_York 中一样。如果您想要按用户设置,则需要将时区信息与每个日期时间对象一起从用户客户端一直传递到数据库。时区是复杂的事情,超出了 SO 答案的范围。我建议阅读该主题。可以在此博客上找到一些有用的信息:codeofmatt.com/tag/time-zone。

以上是关于django 中的日期时间错误的主要内容,如果未能解决你的问题,请参考以下文章

Django 模板标签从错误的日期显示对象

使用 django 查询返回活动时区中的日期时间

使用 xlwt 将日期时间导出到 django 中的 excel

Django 模板中的日期/时间格式

检查日期是不是对选定的月份有效 Django 表单

Django中的简单日期时间选择器