Django:时区问题

11 django timezone

注意:我删除了之前存在的问题,并在此处仅提供相关信息.

我们的数据库服务器(RH)指定了TIME_ZONE ="Europe/London".并且,在Django settings.py中,我们指定TIME_ZONE ="America/New_York".

并且,在我的Model类中,我指定了:

created = models.DateTimeField(editable=False,auto_now=False, auto_now_add=True)
modified = models.DateTimeField(editable=False,auto_now=True, auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

当我再去查看管理站点中的数据时,我得到UTC/GMT时间而不是东部时间.

我认为所有的时间都是由Django自动调整的,因为我将"America/New_York"指定为Django的时区.

任何帮助/澄清表示赞赏.

谢谢Eric

JCo*_*ton 12

依赖日期/时间'automagic'是危险的,这些auto_add模型参数是一个陷阱.始终了解您正在处理的时区.Python通过将tzinfo成员附加到其datetime对象来简化这一过程.虽然默认情况下这些对象是"天真的",但我建议您始终附加tzinfo详细信息.仍然Python需要一些python-dateutilpytz(我使用的)的额外帮助.这是一个通用规则 - 始终将您的日期时间存储在数据库中作为UTC.

为什么?您的用户可能在不同的本地人,移动电话和笔记本电脑旅行,服务器配置错误或镜像在不同的时区.这么多头疼.日期时间永远不应该是幼稚的,如果它们(如在数据库中)并且您需要上下文,则还要在表中包含时区字段.

所以在你的情况下.

  1. 不要使用auto_now字段,而是使用自定义save().
  2. 将UTC存储在数据库中
  3. 如果您需要知道时区 - 例如用户事件 - 也将时区存储在数据库中.
  4. 转换为必要/请求的时区

如果你使用pytz,localize()方法很棒.Python的datetime对象具有有用的replace()和astimezone().

还有一点需要注意,如果您的数据库是时区(如MySQL),请确保您的日期时间是UTC,然后使用replace(tzinfo = None),因为数据库连接器无法处理tz感知对象.

这里是一个线程与Django的auto_now领域的细节.