好的,所以我一直对时区感到困惑。我越来越好,但还没有到。你们能启发我吗?
上下文:我从前端收到UTC时间。例如,要表示date 1 September 2019
,我会得到2019-08-31 22:00:00Z
(我们在布鲁塞尔夏令时,因此有2个小时的时差)。
从那时起,我需要在此之前产生一系列的6个月。就是这样March April May June July August
。
我设法找到了一个解决方案,说实话,有些运气不好。我仍然不确定我是否了解以下情况的详细信息:
database=> show timezone;
TimeZone
----------
UTC
(1 row)
database=> select generate_series(
('2019-08-31 22:00:00Z'::timestamp at time zone 'Europe/Brussels')::date - '6 month'::interval,
('2019-08-31 22:00:00Z'::timestamp at time zone 'Europe/Brussels')::date - '1 month'::interval,
'1 month'::interval
);
generate_series
---------------------
2019-02-28 00:00:00
2019-03-28 00:00:00
2019-04-28 00:00:00
2019-05-28 00:00:00
2019-06-28 00:00:00
2019-07-28 00:00:00
(6 rows)
database=> select generate_series(
('2019-08-31 22:00:00Z' at time zone 'Europe/Brussels')::date - '6 month'::interval,
('2019-08-31 22:00:00Z' at time zone 'Europe/Brussels')::date - '1 month'::interval,
'1 month'::interval
);
generate_series
---------------------
2019-03-01 00:00:00
2019-04-01 00:00:00
2019-05-01 00:00:00
2019-06-01 00:00:00
2019-07-01 00:00:00
2019-08-01 00:00:00
如果使用,为什么会得到错误的结果::timestamp
?
实际上有两个不同的“操作符”命名为AT TIME ZONE
,一种转换为,另一种转换timestamp with time zone
为timestamp without time zone
。
如果第一个参数是a timestamp with time zone
,则该值将转换为a timestamp without time zone
,从而显示该时区的挂钟会显示什么。
如果第一个参数是a timestamp without time zone
,它将在会话时区(由timezone
参数的值给出)中进行解释,并转换为绝对时间戳。
现在timestamp with time zone
是日期/时间类型类别的首选类型,因此第二个查询中的字符串文字将根据文档解释为。在第一个查询中,它是一个。由于涉及不同的运算符,因此结果不同也就不足为奇了。timestamp with time zone
timestamp without time zone
在您的第一个查询中,挂钟时间22:00被解释为时钟挂在布鲁塞尔,因此实际上是20:00 UTC。generate_series
从开始计数的第一个参数是2019年2月28日,世界标准时间20:00(在强制转换为之前date
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句