如何将PostgreSQL数据库中的时间戳转换为用户时区时间?
我在一个网页应用中使用SQLAlchemy和PostgreSQL。
我的SQLA模型大致是这样定义的:
class MyModel(Base):
ts_field = Column(DateTime(timezone=True))
# more here, obviously
我的网页应用用户有一个timezone
属性,这个属性的格式我还没确定(这也是我提问的一部分),它决定了如何向用户显示时间戳。显然,他们并不都是在服务器所在的时区,所以系统的时区对他们来说并不是很有用。
我想要一个简单的方法,根据每个用户选择的时区,获取格式化好的时间戳。
(我对时区转换的很多术语不是很清楚,所以如果我问得不够清楚——我敢打赌我确实不清楚!——请随时评论帮我澄清一下!)
2 个回答
0
你可以使用 pytz 来进行时间转换。
1
好的,当你创建一个带时区的时间戳(简称为timestamptz)时,pg会生成一个时间戳,并在存储时把当前时区转换成GMT(格林威治标准时间)。
当你取出这个时间戳时,可以把时区设置成你想要的任何其他时区。例如:
smarlowe=# set timezone='est';
SET
smarlowe=# select now();
now
2010-11-30 00:38:32.683625-05
(1 row)
smarlowe=# set timezone='mst';
SET
smarlowe=# select now();
now
2010-11-29 22:38:48.293708-07
你可以用“at time zone”这个说法来简化操作:
smarlowe=# set timezone='mst';
SET
smarlowe=# select now();
now
-------------------------------
2010-11-29 22:40:15.854833-07
(1 row)
smarlowe=# select now() at time zone 'est';
timezone
----------------------------
2010-11-30 00:40:17.243828
这样就不需要每次都重复设置每个时区,只需在每个语句中根据正确的时区进行设置即可。