如何将PostgreSQL数据库中的时间戳转换为用户时区时间?

1 投票
2 回答
1479 浏览
提问于 2025-04-16 07:47

我在一个网页应用中使用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

这样就不需要每次都重复设置每个时区,只需在每个语句中根据正确的时区进行设置即可。

撰写回答