我目前使用以下方法从 UTC 日期时间获取本地日期时间:
SET @offset = DateDiff(minute, GetUTCDate(), GetDate())
SET @localDateTime = DateAdd(minute, @offset, @utcDateTime)
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果夏令时发生在GetUTCDate()
和之间@utcDateTime
,@localDateTime
最终会休息一个小时。
是否有一种简单的方法可以将非当前日期的日期从 UTC 转换为当地时间?
我使用的是 SQL Server 2005
我在回答这个stackoverflow问题时发现了奇怪的结果:
select * from pg_timezone_names where name = 'Europe/Berlin' ;
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Berlin | CET | 01:00:00 | f
Run Code Online (Sandbox Code Playgroud)
和下一个查询
select id,
timestampwithtimezone,
timestampwithtimezone at time zone 'Europe/Berlin' as berlin,
timestampwithtimezone at time zone 'CET' as cet
from data ;
id | timestampwithtimezone | berlin | cet
-----+------------------------+---------------------+---------------------
205 | 2012-10-28 01:30:00+02 | 2012-10-28 01:30:00 | 2012-10-28 00:30:00
204 | 2012-10-28 02:00:00+02 | 2012-10-28 02:00:00 | 2012-10-28 01:00:00
203 | 2012-10-28 02:30:00+02 …
Run Code Online (Sandbox Code Playgroud) 沿着这个相关问题的思路:
是否有任何有效的实际使用用例 TIME WITH TIME ZONE
或应该将其视为反模式?
需要明确的是:我问的是TIME…
,而不是TIMESTAMP…
。
我一直在研究“查看”时间的不同方式以及如何在 Postgres 中正确映射它,但我仍然不确定实际使用什么。有几篇文章建议或者更确切地说说服您将日期存储为timestamp with time zone
,而不是存储为 just timestamp
。我尤其在夏令时方面遇到困难。
我的用例是一个简单的面向最终用户的应用程序,只能由“欧洲/柏林”时区的人员访问。用户撰写的帖子会与创建和更新的时间戳一起存储。
假设用户在 上发布了帖子2020-01-01T10:00:00+01
。如果用户现在在同一天阅读该帖子,它应该显示posted on 1st of January at 10 am
。如果同一篇文章7 月在柏林被点击,它仍然应该显示posted on 1st of January at 10 am
“无论夏令时如何”。
我的直觉是将时间存储为 a timestamp without time zone
,否则 Postgres 会将该时间转换为 UTC 并以这种方式存储。稍后我将无法参考该帖子发布的实际时区。在这种情况下,它会显示为posted on 1st of January at 11 am
(由于柏林现在提前两个小时),如果作者要检查最初的时间,这可能会让他们感到困惑发表了这篇文章。
我的想法是否正确,我是否发现了不使用的极端情况之一timestamp with time zone
,或者我在这里错过了一些重要的东西?