【问题标题】:Weird behavior of Django's timezone.now()Django timezone.now() 的奇怪行为
【发布时间】: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 是的,他们都是。请参阅下面的答案,我只是用不同的名称重新创建了完全相同的字段,一切正常。不确定那里发生了什么,因为我不相信该字段本身可以进入不同的时区。

标签: python django timezone


【解决方案1】:

仍然无法理解发生了什么,但我最终创建了另一个具有确切属性的日期时间字段并改用这个,删除旧的 lastcheckintime 并且一切正常。

这仍然是个谜…… 谢谢!

【讨论】:

    猜你喜欢
    • 2017-01-30
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2016-04-27
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多