【发布时间】:2015-07-10 05:31:28
【问题描述】:
我正在保存最后一次访问页面的时间,自从我升级到 Django 1.8 后,我所有的日期都变得很不稳定......而且我真的,真的不明白。
我基本上有一个 API 被美国各地的自助服务终端计算机设置,但我想知道自助服务终端是否在过去 3 分钟内签到。我不在乎它在哪个时区。
我有一个简单的日期时间字段:
lastcheckintime = models.DateTimeField(blank=True, null=True, auto_now=False)
当调用 API 时,我只需保存这个:
monitor.lastcheckintime = timezone.now()
使用调试日志,看起来它在数据库中保存了正确的 UTC 时间。我正在检查监视器是否在线:
@property
def is_online(self):
if self.lastcheckintime is None:
return False
time_threshold = timezone.now() - timedelta(minutes=3)
return self.lastcheckintime > time_threshold
在我升级之前它曾经是完美的。分不清是 Django 升级到 1.8 还是 pytz 本身,但现在看起来是这样的:
(在我的时区是晚上 10:29)
奇怪的是,这些线条发生了变化!在错误的时间并不总是同一台显示器。此外,整个事情已经结束了 7 个小时(我是 GMT -7)。任何其他模型看起来都可以正常工作,我完全不知道为什么这个模型行为不正常。
有什么我可能错过的想法吗?
谢谢!
【问题讨论】:
-
我想不出 1.8 中的任何更改会导致这种情况。
USE_TZ的值是多少?您看到的行为看起来像是从使用USE_TZ=True变为USE_TZ=False。 -
timezone.now()source code 还暗示settings.USE_TZ可能在您的环境中发生了变化。 -
我的 USE_TZ 仍然设置为 true。在我的情况下,每个设备设置在哪个时区并不重要,对吧? (无论如何它们都应该在同一个中)
-
@AlbanDumouilla:您有责任确保系统的所有部分(db、OS、django)使用相同的时区,例如,避免将 utc 时间解释为本地时间和反过来。
-
@J.F.Sebastian 是的,他们都是。请参阅下面的答案,我只是用不同的名称重新创建了完全相同的字段,一切正常。不确定那里发生了什么,因为我不相信该字段本身可以进入不同的时区。