无法使timezone datetime对象打印正确的时间

时间:2013-03-03 17:28:37

标签: python django timezone

我真的很难用时区把握住这个问题。我有一个日历应用程序,其模型如下:

class Events(models.Model):
    dtstart = models.DateTimeField('Start')
    ...

    def __unicode__(self):
        aware = self.dtstart.replace(tzinfo=timezone.get_current_timezone())
        #dt = defaultfilters.date(aware, 'Y-m-d H')
        dt = aware.strftime('%Y-%m-%d %H:%M')
        return dt

并且settings.py包含:

TIME_ZONE = 'Europe/Stockholm'
USE_TZ = True

如果我使用Django管理界面添加明天19:00左右开始的事件,那么sqlite-db将包含:

$ sqlite3 ~/django_test.db "SELECT dtstart from events_events"
2013-03-04 18:00:00

这对我来说似乎是一个时间戳(我怀疑这是正确的)。当我渲染html时,使用{{event.dtstart|date:"H.i"}}一切都很好。它应该显示19:00。但问题是Event类上的__unicode__ - 方法返回2013-03-04 18:00。我有,你可以看到试图解决这个问题,但我被卡住了。我的问题在哪里,如何使此__unicode__方法返回2013-03-04 19:00。我认为现在这里是瑞典的夏令时。

1 个答案:

答案 0 :(得分:1)

请勿使用.replace(tzinfo=tz)设置时区,而是使用tz.localize()

aware = timezone.get_current_timezone().localize(self.dtstart)

请参阅pytz documentation

  

第一种方法是使用pytz库提供的localize()方法。这用于本地化一个天真的日期时间(没有时区信息的日期时间):

>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))
>>> print(loc_dt.strftime(fmt))
2002-10-27 06:00:00 EST-0500

但是,如果你的日期时间是UTC时间,你应该使用UTC时区,然后用不同的时区表示时间进行显示:

from pytz import UTC

aware = UTC.localize(timezone.get_current_timezone())
dt = aware.astimezone(timezone.get_current_timezone()).strftime('%Y-%m-%d %H:%M')