我用 Django 1.5.4 和 postgres 9.1 创建了一个活动站点。“回退”的时间刚刚更改,管理员在时间更改之前输入的所有日期/时间数据现在都减少了一个小时。
在我的 Django 设置中,我有TIME_ZONE = 'America/Chicago'
和USE_TZ = True
. 活动地点适用于美国中部时区的一个小城市。服务器和数据库也设置为这个时区。查看数据库,我可以知道哪些事件发生在更改之前,因为它们最后都说“-05”,而在“-06”之后输入的事件。虽然,据我了解,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 ,并且时间在管理员中正确显示。
更新:只有在时间更改之前创建并在时间更改之后发生的事件才会延迟一个小时。所以从技术上讲,一切正常,因为它们是在不同的时区创建的,所以调整是有一定意义的。所以问题是,有没有办法在时间改变之前用正确的时间创建应该在时间改变之后发生的事件?现在我将不得不告诉管理员只在时间更改之前创建事件,然后在时间更改后创建更多事件。这是荒谬的。