Python tzinfo和白天时间
-
08-07-2019 - |
题
(我是Python和Google App Engine的新手,如果我的问题看起来很基本,请原谅我。)
我正试图在我的Google App Engine应用程序中管理多个用户时区。
以下是我的约束:
- 如果用户在输入中输入时间,则为当地时间(包括DST,适当时)。
- 如果用户未输入时间,系统必须在当地时间为他们输入该时间(包括DST,适当时)。
- 当向用户显示日期和时间时,它必须是当地时间(包括夏令时,适当时) 醇>
我知道时间将在内部存储为带有tzinfo对象的UTC,并且App Engine将以UTC时间存储模型。
我以前认为通过要求用户在他们的偏好中指定他们的时区来解决这个问题。然后,我只需加载他们的首选项并将该tzinfo添加到任何引用该用户的日期时间对象。
然而,我们最近的夏令时打破了它。事实证明我没有在我的tzinfo对象中正确实现dst()。据我了解,我必须确定DST当前是否打开,如果是,则返回tzinfo的正确偏移量。
问题是,我不知道如何确定时区的日光时间是否是最新的。我错过了一些明显的东西吗?
解决方案
如果可以的话,我建议你看一下 python-dateutil
包,它包含为所有时区预先构建的tz对象,包括DST偏移信息。我认为没有办法“只知道”如果DST开启或没有支持数据......它是大多数时区的日期驱动(或者至少是支持DST的时区),日期根据当地习俗,政治和各种方式而有所不同。
其他提示
我在这里看到一些问题。
如果用户输入时间,则以当地时区输入,但您如何知道它是哪一个?欧洲/维尔纽斯还是欧洲/马德里?或者澳大利亚/墨尔本?如果您不知道时区,则日期/时间将变为“天真”。
唯一被认为是适当且准确的(考虑到持续流量状态)的时区数据库是Olson timezone db,可用于Python pytz 包。它允许在时区之间轻松转换日期/时间:首先从用户获取日期/时间和时区,在用户的时区中本地化日期/时间,然后将其作为utc,准备保存到您的数据库。显示是另一种方式:从数据库获取日期/时间,在utc中本地化,然后显示为用户时区。
最后一件事:没有自动DST转换这样的东西。如果日期/时间不明确,您必须事先知道输入时间的时区。这是我们的人类现实。