关于谷歌应用引擎:Python tzinfo和日光时间

Python tzinfo and daylight time

(我刚接触过python和google应用引擎,如果我的问题看起来很基本,请原谅我)。

我在google应用引擎应用程序中管理多个用户时区,真是太棒了。

以下是我的限制条件:

  • 如果用户在输入上输入时间,它将是本地时间(适当时包括DST)。
  • 如果用户未输入时间,系统必须在其本地时间(包括DST,如果适用)为其输入时间。
  • 向用户显示日期和时间时,必须以其本地时间(适当时包括DST)显示。
  • 我知道时间将在内部存储为带有TZINFO对象的UTC,并且应用程序引擎将使用UTC时间存储模型。

    我以前以为我是通过要求用户在他们的首选项中指定他们的时区来解决这些问题的。然后,我只需加载它们的首选项,并将TZINFO添加到引用该用户的任何日期时间对象中。

    然而,我们最近的夏令时打破了它。结果发现,我没有在TZINFO对象中正确实现dst()。据我所知,我必须确定DST是否当前处于打开状态,如果是,则返回TZINFO的正确偏移量。

    问题是,我不知道如何确定时区的夏令时是否是当前的。我是否遗漏了一些明显的东西?


    如果可以的话,我建议您看看python-dateutil包,它为所有时区预先构建了TZ对象,包括DST偏移信息。我不认为有一种方法可以"只知道"DST是否在没有支持数据的情况下启用…对于大多数时区(或者至少是支持DST的时区),它是日期驱动的,并且日期根据当地风俗、政治和各种各样的事情而变化。

    http://labix.org/python-dateutil


    我看到一些问题。

    如果用户输入时间,它将在本地时区输入,但是您如何知道它是哪一个?欧洲/维尔纽斯还是欧洲/马德里?或者澳大利亚/墨尔本?如果你不知道时区,日期/时间就会变得"幼稚"。

    唯一被认为合适和准确的时区数据库(考虑到恒定流量的状态)是olson timezone db,可以作为pytz包提供给python。它允许在时区之间轻松转换日期/时间:首先从用户处获取日期/时间和时区,在用户时区中本地化日期/时间,然后将其作为UTC,准备保存到数据库。显示是另一种方式:从数据库中获取日期/时间,在UTC中本地化,然后显示为用户时区。

    最后一件事是:没有自动DST转换。如果日期/时间不明确,您必须提前知道输入的时区。这就是我们人类的现实。