Django和时区:如何在模板中将感知日期时间渲染为天真的(使用pytz)

时间:2013-04-25 16:03:08

标签: python django timezone pytz

我有这些模特:

class TimeZone(models.Model):
    name = models.CharField(max_length = 40, unique = True, editable = False)
    def tz(self):
        return pytz.timezone(str(self.name))

class Place(models.Model):
    name = models.CharField(max_length=200)
    timezone = models.ForeignKey(TimeZone)

class PlaceAction(models.Model):
    action_time = models.DateTimeField(blank=True, null=True)
    place = models.ForeignKey(Place, related_name='Stop place')

    def save(self, *args, **kwargs):
        place_tz = self.place.timezone.tz()
        if self.action_time:
            self.action_time = place_tz.localize(self.action_time)
        return super(PlaceAction, self).save(*args, **kwargs)

我的用户在表单中输入了一个地点和一个天真的日期时间。 我已经在DB中拥有该地点的时区,因此我不需要用户的时区。我将此日期时间转换并保存为DB中的识别日期时间(我使用Postgres)。 使用正确的偏移量正确保存数据。

当我想渲染数据时(例如以更新形式),Django将其转换回天真的日期时间,但使用settings.py的默认时区(TIME_ZONE ='UTC')。 我想知道使用正确的时区(Place对象之一)将知晓日期时间转换回天真时间的最佳方法。我宁愿在模型级而不是模板级进行转换(我使用JQueryUI进行日期时间选择,因为第一次转换是在那里完成的,我宁愿在同一个地方进行反向转换。)

我的一些想法: 在模型PlaceAction init ()? 有自定义经理吗?

我无法在文档中找到最佳做法,以便反向转换为与默认时区不同的时区。有吗?

2 个答案:

答案 0 :(得分:0)

您可以向PlaceAction添加转换为天真的方法,然后在模板中使用该方法。

class PlaceAction(models.Model):
    action_time = models.DateTimeField(blank=True, null=True)
    place = models.ForeignKey(Place, related_name='Stop place')

    def naive_action_time (self):
        """action_time but without the timezone :-)

        """
        # Updated from Renaud Milon's comment
        return self.action_time.astimezone(place_tz).replace(tzinfo=None)

{% place_action.naive_action_time %}

答案 1 :(得分:0)

天真的日期时间是一个不知道时区的日期时间。要将时区感知日期时间渲染为天真,您只需显示时区。

  

“我想了解转换知晓日期时间的最佳方法   天真的,使用正确的时区“

这句话根本没有任何意义。由于天真的日期时间,没有正确的时区。我怀疑你想要的是从数据库给你的UTC日期时间将日期转换为特定的时区。

在视图中,正确的地方是这样做的。始终在内部保持UTC,并仅转换为显示。这是简单的方法。