【问题标题】:Django DST Time change issue with django datetimefielddjango datetimefield 的 Django DST 时间更改问题
【发布时间】:2015-01-11 11:55:38
【问题描述】:

我在使用 DateTimeField 时在我的 django 应用程序中遇到问题。这主要是因为 DST 时间变化。

我在 2015 年 10 月 30 日(上周 DST)创建了一个活动。 我创建了第一个活动的副本,该活动将于 2015 年 11 月 6 日(非 DST 日)

我申请了 7 天的 timedelta,所以它变成了 7 天以上。但我几个小时都没有使用 timedelta。

由于夏令时,它减少了 一小时。我不需要这个。我只想有相同的时间。我该怎么做?

我试过这个,但没有帮助我。

DST timezone issue in django app

请看这个截图

我的models.py

from django.db import models
from datetime import timedelta

class Event(models.Model):

    name = models.CharField(max_length=100)

    created = models.DateTimeField(auto_now_add=True)

    start_date = models.DateTimeField()

    def __unicode__(self):
        return self.name


    def copy_event(self, add_days=timedelta(days=7)):

        start_date = self.start_date + add_days
        name = self.name +' (copy)'
        new_event = Event(name = name,created = self.created,start_date=start_date,)

        new_event.save()

        return new_event

【问题讨论】:

  • 我有USE_TZ=True
  • 您在设置中为TIME_ZONE 设置了什么?
  • 我将加拿大/东部放入我的设置文件中

标签: python django dst


【解决方案1】:

自从USE_TZ=True 以来,您一直在处理有意识的日期时间,它代表了一个精确的时间点。通常,该时刻将根据current time zone 以不同方式显示。有些时区有 DST,有些则没有,所以一般来说,您无法存储日期时间,以便所有时区的所有用户都能看到您想要的时钟时间(即与被复制的事件相同的时钟时间)。

我能想到几个解决方法:

  1. 如果您只服务一个时区(也就是说,当前时区总是相同的),您可以在那个时区进行算术运算。

    from django.utils.timezone import localtime
    new_start_date = localtime(self.start_date) + add_days
    

    添加add_days 将始终保持时钟时间相同(即不考虑夏令时)。 new_start_date 将转换为 UTC 并存储,然后转换回所需的本地时间以进行显示。

  2. 您真正想要表示的是特定日期的特定时钟时间,而不是确切的时刻。所以也许你根本不想使用有意识的日期时间。一种选择是设置USE_TZ=False,但这是您可能不想进行的全局性、影响深远的更改。另一种选择是对该字段使用不同的表示形式。例如,您可以使用DateFieldTimeField 而不是DateTimeField

【讨论】:

    【解决方案2】:

    发现这是最好的解决方案

    from django.utils.timezone import localtime
    
    l = Event.objects.get(...)
    time = localtime(l.time + timedelta(days=7))
    time += localtime(l.time).dst() - time.dst()
    

    【讨论】:

      【解决方案3】:

      我在 Django 中创建重复事件时遇到了同样的问题,这是我发现的解决方案,它非常干净并且 - 到目前为止 - 有效。使用您拥有的代码:

      start_date = self.start_date + add_days
      

      试试:

      start_date = self.start_date.replace(tzinfo=None) + add_days
      

      这会将 self.start_date 参数转换为简单的日期时间,并允许在不考虑时区的情况下添加天数。我自己对此进行了广泛的测试,它既可以向前跳也可以向后跳。

      参考:Converting timezone-aware datetime to local time in Python

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-03
        • 2013-08-17
        • 2014-06-17
        • 2013-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-06
        相关资源
        最近更新 更多