我正在用Sqlalchemy(带Postgres)在烧瓶应用程序中摆弄时区。Postgres将datetime保存为带有时区的时间戳,默认情况下,所有datetime都存储在UTC中。使用python的钟摆库很容易转换到不同的时区。
class Order(Model):
id = Column(Integer, primary_key=True)
code = Column(String(10))
order_date = Column(DateTime(timezone=True))
我想把
order_date
一个
Order
-由一个
order_id
-查询时将其发送到用户的时区。我能做到(我想)
user.timezone
是一个有效的时区):
order = db.session.query(id,
code,
func.timezone(user.timezone, Order.order_date).label('order_date'))\
.filter(Order.id == order_id)\
.first()
但有时更容易
get
这个
顺序
:
order = Order.query.get(order_id)
通过后一种方式,我获得存储的UTC
订单日期
.可以将
订单日期
使用
收到
作用
我的解决办法是
收到
对象,检查模型的字段(假设在实际情况下,一个对象可能有多个datetime字段),如果一个字段是
datetime
,将其转换为用户的时区,如下所示:
import datetime
import pendulum
def convert_tz(obj, tz):
for each in obj.__dict__:
d = getattr(obj, each)
if isinstance(d, datetime.datetime):
setattr(obj, each, tz.convert(d))
order = Order.query.get(order_id)
tz = pendulum.timezone(user.timezone)
convert_tz(order, tz)
这似乎很有效,但也似乎太复杂了。有更好的办法吗?
谢谢