Django DST django datetimefield的时间变化问题

时间:2014-11-14 06:21:09

标签: python django dst

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

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

我申请了7天的timedelta,所以它追溯到7天以上。但我几个小时都没有时间。

由于Day Light节省,它减少了一小时。我不需要这个。我只想要有相同的时间。我怎么能这样做??

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

DST timezone issue in django app

请看这个截图 enter image description here

我的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

3 个答案:

答案 0 :(得分:0)

USE_TZ=True以来,您总是处理意识到的日期时间,这代表了精确的时刻。通常,这个时刻将根据current time zone以不同方式显示。有些时区有DST,有些则没有,所以一般情况下你无法存储日期时间,以便所有时区的所有用户都能看到你想要的时钟时间(即与复制事件相同的时钟时间)。 / p>

我可以想到几个解决方法:

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

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

    添加add_days将始终保持时钟时间相同(也就是说,它不会考虑DST)。 new_start_date将转换为UTC并以UTC格式存储,然后转换回所需的本地时间进行显示。

  2. 您真正想要表达的是特定日期的特定时钟时间,而不是确切的时刻。所以也许您根本不想使用感知日期时间。一种选择是设置USE_TZ=False,但这是一个您可能不想做的全球性,影响深远的变化。另一种选择是为该字段使用不同的表示。例如,您可以使用DateFieldTimeField代替DateTimeField

答案 1 :(得分:0)

发现这是最好的解决方案

from django.utils.timezone import localtime

l = Event.objects.get(...)
time = localtime(l.time + timedelta(days=7))
time += localtime(l.time).dst() - time.dst()

答案 2 :(得分:0)

我遇到了同样的问题,在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