我在使用DateTimeField
时在我的django应用程序中遇到问题。主要是因为DST时间的变化。
我在2015年10月30日(DST上周)创建了一个活动。 我创建了第一个活动的副本,该活动将于2015年11月6日(非DST日)
我申请了7天的timedelta
,所以它追溯到7天以上。但我几个小时都没有时间。
由于Day Light节省,它减少了一小时。我不需要这个。我只想要有相同的时间。我怎么能这样做??
我试过这个,但没有帮助我。
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
答案 0 :(得分:0)
自USE_TZ=True
以来,您总是处理意识到的日期时间,这代表了精确的时刻。通常,这个时刻将根据current time zone以不同方式显示。有些时区有DST,有些则没有,所以一般情况下你无法存储日期时间,以便所有时区的所有用户都能看到你想要的时钟时间(即与复制事件相同的时钟时间)。 / p>
我可以想到几个解决方法:
如果您只为一个时区服务(也就是说,当前时区总是相同),您可以在该时区进行算术运算。
from django.utils.timezone import localtime
new_start_date = localtime(self.start_date) + add_days
添加add_days
将始终保持时钟时间相同(也就是说,它不会考虑DST)。 new_start_date
将转换为UTC并以UTC格式存储,然后转换回所需的本地时间进行显示。
您真正想要表达的是特定日期的特定时钟时间,而不是确切的时刻。所以也许您根本不想使用感知日期时间。一种选择是设置USE_TZ=False
,但这是一个您可能不想做的全球性,影响深远的变化。另一种选择是为该字段使用不同的表示。例如,您可以使用DateField
和TimeField
代替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