查询有关时区的一天

时间:2019-07-05 17:37:11

标签: python datetime flask sqlalchemy timezone

我有一个表中的UTC日期时间列表。我想获取 local 时区中的不同日期,并再次获取 local 时区中每个日期的条目数。

我确定我使这个问题复杂化了,但是我对Python和SQLAlchemy还是很陌生,更不用说日期,时间和时区了。

我正在使用带有default = utcnow()的列将时间戳记存储在UTC中...这很好用:2019-07-05 06:19:59.920630

我甚至可以根据需要(在应用程序的其他部分)在浏览器的当前时区显示时间戳。

但是我试图基于时区运行 SQLAlchemy查询,以便仅获取该用户本地日的条目。

2019-07-05 06:19:59.920630可以使用我的utc_to_local helper函数转换为2019-07-04 23:19:59.920630 ...所以我需要我的查询在所有查询中都包含该datetime条目记录“ 2019年7月4日”

所以我正在运行SQLAlchemy查询以获取不同日期的列表

>>>uniquedays=db.session.query(func.distinct(func.DATE(TableClass.timestamp))).all()

,但我刚刚意识到这将返回一个日期列表,该日期可能没有用户所在地区的任何记录...在我的示例中,7月5日没有我的时区的任何条目,但将其返回为唯一的一天。

所以我也可以像这样返回datetimelist:

>>>datetimelist = db.session.query(TableClass.timestamp).all()

但是现在我有了日期时间(我认为)元组的列表:

>>>datetime
[(datetime.datetime(2019, 6, 30, 21, 8, 11, 354018),), (datetime.datetime(2019, 6, 30, 21, 21, 58, 158467),), (datetime.datetime(2019, 6, 30, 23, 39, 8, 310248),)....................

我正在使用它将utc日期时间转换为我的本地时间:

def utc_to_local(utc_dt):
    return utc_dt.replace(tzinfo=timezone.utc).astimezone(tz=None)

我现在正在使用SQLite,但打算切换到MySQL数据库进行生产。

1 个答案:

答案 0 :(得分:0)

理想情况下,这将在数据库级别完成。在MySQL中,可能看起来像这样:

user_tz = 'PST'
uniquedays = db.session.query(func.distinct(func.DATE(
                 func.convert_tz(TableClass.timestamp, 'UTC', user_tz)))).all()

遗憾的是, SQLite doesn't support是完全灵活的时区转换。因此,在切换之前,您将不得不在Python中执行此操作。希望您没有数百万行?

import arrow
from collections import Counter

datetimelist = db.session.query(TableClass.timestamp).all()
dates = [arrow.get(dt[0]).to('US/Pacific').date() for dt in datetimelist]
counter = Counter(dates)

另一种方法是使用SQLAlchemy's hybrid properties,但是如果您马上就要切换到实际的数据库,那么麻烦就不值得了。