有没有一种方法可以在 Postgres 中存储带有时区的时间戳而不将其转换为 UTC

问题描述 投票:0回答:2

我想保存例如在带有时区列的 Postgres 时间戳 '2012-08-24 14:00:00+03:00' 尝试进行选择后,我得到“2012-08-24 11:00:00+00:00”。

我知道我的数据库位于 UTC 区域,但是有没有办法保存它并且不丢失我发送的原始时区信息?

database postgresql timestamp timezone
2个回答
0
投票

没有 date/time 类型存储时区,因为它是一条单独的信息。如果您的源数据带有时区偏移,请勿使用

timestamp
- 它将被修剪掉。

如果偏移量或其他有效时区信息存在于值文字/常量中,则用于将时间戳转换为 UTC 以进行内部存储。当数据库在您

select
时将其读回给您时,它会根据您的
timezone
设置
再次移动。如果您确实想获得您指定的输出,无论出于何种原因,您都可以:

create table test(tstz timestamptz, ts timestamp);
insert into test 
select '2012-08-24 14:00:00+03:00'::timestamptz,
       '2012-08-24 14:00:00+03:00'::timestamp
returning *;
tstz ts
2012-08-24 11:00:00+00 2012-08-24 14:00:00
set timezone='utc-03:00';
select tstz,ts from test;
select to_char(tstz,'YYYY-MM-DD HH-MI-SSOF'),
       to_char(ts,'YYYY-MM-DD HH-MI-SSOF') from test;
tstz ts
2012-08-24 14:00:00+03 2012-08-24 14:00:00
to_char to_char
2012-08-24 02-00-00+03 2012-08-24 02-00-00+00
--Standard time: Australian Central Western Standard Time (ACWST)
--Example city: Eucla
set timezone='UTC +8:45';
select tstz,ts from test;
select to_char(tstz,'YYYY-MM-DD HH-MI-SSOF'),
       to_char(ts,'YYYY-MM-DD HH-MI-SSOF') from test;
tstz ts
2012-08-24 02:15:00-08:45 2012-08-24 14:00:00
to_char to_char
2012-08-24 02-15-00-08:45 2012-08-24 02-00-00+00

小提琴


0
投票

带有时区列'2012-08-24 14:00:00+03:00'的时间戳,在尝试进行选择后我得到'2012-08-24 11:00:00+00

正如您所见,并且如文档所述,对于

TIMESTAMP WITH TIMEZONE
类型的列,Postgres 使用输入相对于 UTC 的偏移量来调整为零小时-分钟-秒的偏移量。

您的偏移量表示时间为 14:00,比 UTC 早 3 小时。因此 Postgres 将时间调整为 11:00,偏移量为零。同一时刻,时间轴上的同一点,不同的视角。

如果知道原始偏移量对您很重要,您需要将该事实保存为另一列中的值。我建议使用文本类型的列,以标准 ISO 8601 格式存储偏移值。

© www.soinside.com 2019 - 2024. All rights reserved.