【发布时间】:2015-01-01 12:36:51
【问题描述】:
Python Google App Engine (GAE)
在数据存储中,我在条目中存储了日期时间,它采用 UTC(预期行为)。
问题在于使用 query.filter 来获取另一个时区的特定日期。
示例 GAE 数据存储日期时间条目 (UTC):
- 2014-11-4 晚上 11 点 UTC
- 2014 年 11 月 4 日下午 12 点 UTC
- 2014-11-4 01am UTC
很简单,可以使用 UTC 按日期提取这些条目:
query_date = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
query.filter('DateTimeUTC >=', query_date)
query.filter('DateTimeUTC <', query_date+timedelta(days=1))
或者像这样:
start_date = datetime.strptime('11/04/2014', '%m/%d/%Y')
end_date = datetime.strptime('11/05/2014', '%m/%d/%Y')
query.filter('DateTimeUTC >=', start_date)
query.filter('DateTimeUTC <', end_date)
但是,让我们考虑一个事实,尽管这三个条目是在 2014 年 4 月 11 日根据 UTC 输入的,但原始用户在 PST 中,因此第三个条目实际上是在 2014 年 11 月 3 日,而不是在4 日(世界标准时间凌晨 1 点 = 太平洋标准时间前一天下午 5 点)。
因此,使用此示例代码和数据,让我们想象一组更大的数据,所有数据均由用户在 PST、EST 等中输入,现在您正尝试为每个数据提取特定日期(让我们专注于 PST保持一致 - UTC-8)。
您如何查询.filter 特定时区的天数,而不是使用 UTC 的天数定义?
再次,尝试坚持 PST,以便我们都在同一个页面上。
我正在尝试使用这种格式使事情保持简单和干净,但是如果我在 GAE 上的代码风格在性能方面很慢或者有更好的路线(与此相比通过速度证明),那么我完全赞成它。
【问题讨论】:
-
我知道更新现有实体会很痛苦,但为什么不将日期时间存储为 PST 而不是 UTC?或者当您构建开始/结束日期时将它们移动 8 以成为 PST?
-
当你有一个在不同时区(PST、EST 等)有多个人的全球应用程序时不起作用,这有意义吗?
-
确实如此,在进行搜索时,他们总是来自 PST 还是来自人们所在的地方?如果是当地时间,那么当您进行过滤时,只需从时间中减去时区即可。
-
GAE 仅以 UTC 存储,因此通过在其服务器上存储在 PST 中进行转换,您会遇到转换回来的问题,因为当您说存储在 UTC 环境中的 PST 时间不正确时然后转换为 EST。
标签: python google-app-engine datetime timezone google-cloud-datastore