我想弄清楚Postgres如何处理夏令时与时间间隔的结合。具体来说,我希望允许我的用户创建带有重复日期的事件,例如每天在当地时间下午4点。
对于我正在做的事情,我需要以用户的当地时间存储第一个日期,然后添加一些天数,而不改变用户的当地时间中的时分秒。我希望使用带有完整时区名称的timestamptz(因此它知道何时应用DST?)与简单的一天时间间隔来完成此任务,但它在我的简单示例中失败了:
德国采用CET(+1:00),并在3月28日早上2点切换到CEST(+2:00)。突尼斯全年使用CET。
因此,我期望在3月27日使用timestamptz并添加1天后,在柏林看到不同的UTC偏移量,在突尼斯没有变化,但它们都平等地更改了偏移量,就像突尼斯正在使用DST一样:
对于我正在做的事情,我需要以用户的当地时间存储第一个日期,然后添加一些天数,而不改变用户的当地时间中的时分秒。我希望使用带有完整时区名称的timestamptz(因此它知道何时应用DST?)与简单的一天时间间隔来完成此任务,但它在我的简单示例中失败了:
德国采用CET(+1:00),并在3月28日早上2点切换到CEST(+2:00)。突尼斯全年使用CET。
因此,我期望在3月27日使用timestamptz并添加1天后,在柏林看到不同的UTC偏移量,在突尼斯没有变化,但它们都平等地更改了偏移量,就像突尼斯正在使用DST一样:
select
'2021-03-27 16:00:00 Africa/Tunis'::timestamptz as "tunis_before_dst",
'2021-03-27 16:00:00 Africa/Tunis'::timestamptz + INTERVAL '1 day' as "tunis_after_dst",
'2021-03-27 16:00:00 Europe/Berlin'::timestamptz as "berlin_before_dst",
'2021-03-27 16:00:00 Europe/Berlin'::timestamptz + INTERVAL '1 day' as "berlin_after_dst"
导致结果如下:
tunis_before_dst: '2021-03-27 16:00:00+01'
tunis_after_dst: '2021-03-28 16:00:00+02'
berlin_before_dst: '2021-03-27 16:00:00+01'
berlin_after_dst: '2021-03-28 16:00:00+02'
浏览 pg_timezone_names
,我可以看到我的 Postgres 实例知道 Africa/Tunis
没有 DST - 所以我想知道它为什么会更改其 UTC 偏移量。
我想很明显时区和DST对我来说很困惑,但我处理它们时是否做错了什么或者 timezonetz
不是我想象中的那样?