【问题标题】:Python tzinfo and daylight timePython tzinfo 和夏令时
【发布时间】:2010-10-12 11:24:46
【问题描述】:

(我是 Python 和 Google App Engine 的新手,如果我的问题看起来很简单,请原谅我)。

我正忙着在我的 Google App Engine 应用程序中管理多个用户时区。

这是我的限制:

  1. 如果用户在输入中输入时间,则为当地时间(包括 DST,如果合适)。
  2. 如果用户没有输入时间,系统必须为他们输入当地时间(包括 DST,适当时)。
  3. 向用户显示日期和时间时,必须是他们的本地时间(包括 DST,如果适用)

我了解时间将在内部存储为带有 tzinfo 对象的 UTC,并且 App Engine 将使用 UTC 时间存储模型。

我以前认为我已经通过要求用户在他们的偏好中指定他们的时区来解决所有问题。然后,我只需加载他们的首选项并将该 tzinfo 添加到任何引用该用户的日期时间对象中。

但是,我们最近的夏令时打破了它。事实证明,我没有在我的 tzinfo 对象中正确实现 dst() 。据我了解,我必须确定 DST 当前是否开启,如果是,则返回 tzinfo 的正确偏移量。

问题是,我不知道如何确定时区的夏令时是否是当前时间。我错过了什么明显的东西吗?

【问题讨论】:

    标签: google-app-engine timezone dst


    【解决方案1】:

    如果可以的话,我建议您查看python-dateutil 包,它为所有时区预先构建了 tz 对象,包括 DST 偏移信息。我认为没有办法在没有支持数据的情况下“只知道”DST 是否开启......它是大多数时区(或至少支持 DST 的时区)的日期驱动,并且日期因当地而异风俗、政治和各种事物。

    http://labix.org/python-dateutil

    【讨论】:

    • 我目前使用 dateutil 进行解析等。它有两个问题,1)它需要一个我不必构建 tzinfos 的文件,2)它确定夏令时是基于Google App Engine 时间,而不是用户的时间(使用浏览器)。
    • 我认为该文件是随软件包一起提供的……当我刚刚下载发行版时,它似乎就在那里。
    • 确实,要计算当前时间,或转换时间,它需要服务器/源 TZ 的时间、DST 和时区来确定与目标 TZ 的偏移量......但可以在 TZ 中实例化特定时间(即:下午 4 点,而不是“现在”),而不参考服务器的时钟。
    • 啊,我看到它是一个拉链......谢谢你指出这一点。我会尝试一下,看看它是否能解决我的问题。
    • 哦...对不起...是的,我应该更清楚的是它是一个拉链。很高兴你找到了它……希望它有效。
    【解决方案2】:

    我发现这里有一些问题。

    如果用户输入时间,它输入的是本地时区,但是你怎么知道它是哪个呢?欧洲/维尔纽斯还是欧洲/马德里?或者也许是澳大利亚/墨尔本?如果您不知道时区,日期/时间就会变得“幼稚”。

    唯一被认为适当且准确(考虑到不断变化的状态)的时区数据库是 Olson timezone db,可用于 Python,作为 pytz 包。它允许在时区之间轻松转换日期/时间:首先您从用户那里获取日期/时间和时区,在用户的时区中本地化日期/时间,然后将其作为 UTC,准备保存到您的数据库。显示是其他方式:从数据库中获取日期/时间,以 utc 本地化,然后显示为用户时区。

    最后一件事:没有自动夏令时转换这样的东西。在日期/时间不明确的情况下,您必须提前知道输入时间的时区。这就是我们人类的现实。

    【讨论】:

    • 我想知道你是否错过了我所说的部分,“......通过要求用户在他们的偏好中指定他们的时区......”所以,我预先知道用户的输入时区.我没有 pytz 的配额空间,并且 python-dateutil 包比 pytz 轻得多,并且提供了我需要的一切。
    • 嗯,是的,实际上... 至于包大小,完整的 pytz 是 8 个文件,~500kB。没那么多。
    猜你喜欢
    • 2015-12-04
    • 2021-06-17
    • 2011-02-22
    • 2012-07-09
    • 2012-10-23
    • 2016-02-02
    • 2010-09-19
    • 2017-04-29
    相关资源
    最近更新 更多