我用Django 1.5.4和postgres 9.1创建了一个事件站点。刚刚更改为“退回”的时间以及管理员在时间更改之前输入的所有日期/时间数据现在都是一小时。
在我的Django设置中,我有TIME_ZONE = 'America/Chicago'
和USE_TZ = True
。活动现场适用于美国中部时区的小城市。还为此时区设置了服务器和数据库。查看数据库,我可以判断更改之前发生了哪些事件,因为它们最后都说'-05',并且在说'-06'之后输入了'-05'。虽然,据我所知,postgres应该将时间戳保存为UTC,即使它正在向我显示偏移量。
要显示数据,我将通过Django的ORM将其拉出数据库,然后在每个匹配项的开始日期时间使用astimezone
,如下所示:
LOCAL_TZ = pytz.timezone(settings.TIME_ZONE)
def upcoming_week(start=None):
if not start:
start = date.today()
plus7 = start + timedelta(days=6)
occurs = models.Occurrence.objects.between(start, plus7) \
.select_related('event', 'event__location', 'event__priority')
return (start, plus7, occurs)
def upcoming_week_by_date(start=None):
start, plus7, occurs = upcoming_week()
_occurs_by_date = defaultdict(list)
for o in occurs:
dt = o.start.astimezone(LOCAL_TZ)
_occurs_by_date[dt.date()].append(o)
occurs_by_date = _occurs_by_date.items()
occurs_by_date.sort()
return (start, plus7, occurs_by_date)
这段特殊代码用于在主页上按日期排列事件,并且设置为在午夜开始的全天事件现在显示在前一天。时间也显示为“晚上11点”,由Django呈现(我没有使用pytz处理)。
我也有代码将事件转换为json以供javascript使用,并且使用astimezone
的方式与上面相同,并且所有事件(在时间更改之前创建)过早显示一小时同样。
我在这里使用了一个事件工具分支:https://github.com/FirelightWebware/glamkit-eventtools,时间在管理员中正确显示。
更新:只有在时间变化之前创建的事件发生在时间变化之后发生一小时。所以从技术上讲,一切都正常,因为那些是在不同的时区创造的,调整有一定的意义。所以问题是,是否有一种方法可以在时间变化之前创建在时间变化之后发生的事件,并使用正确的时间?现在我必须告诉管理员只创建出现时间直到时间变化,然后在时间变化之后创建更多出现次数。这太荒谬了。