如何确定特定的带时区时间戳是否处于夏令时内部

3

我有一个应用程序,它以GMT时间存储时间,但与具有Olsen tz名称(例如“America / New York”)的机场相关联。

我需要确定给定日期是否在当地夏令时期间内。

我能找到的最接近的方法是TZ_OFFSET('Tzname'),但没有简单的方法来获取相对于某个日期的下一个DST开始/结束时间。

这似乎是朝着正确方向迈出的一步...

选择将mydate作为时间戳转换为'GMT'时区的结果,同时使用myzoneName作为时区转换为本地时间:

select cast (mydate as timestamp) at time zone 'GMT' as mydateZ, from_tz(cast (mydate as timestamp),'GMT') at time zone myzoneName as mydateLocal

1个回答

0
思考一个类似的问题,我写了以下查询来回答你的问题:
select decode(to_char(from_tz(cast (sysdate as timestamp),'CET'),'TZR'),
to_char(from_tz(cast (sysdate as timestamp),'CET'),'TZD'),'N','Y') is_daylight 
from dual

一个简短的解释: 我将当前日期(sysdate)在我的时区(“CET”)转换为时间戳,并比较时区的正常名称(“TZR”)和夏令时名称(“TZD”)。如果它们匹配,则sysdate不在夏令时期间,如果它们不匹配(例如sysdate-100是'CET'时区的'CEST'),则该日期在夏令时期间。 日期和时区可以是查询的参数。

很好 - 由于我们在美国刚刚“回退”,这个查询显示了差异:选择tzname, to_char(from_tz(cast(sysdate as timestamp),tzname),'TZD'), to_char(from_tz(cast(sysdate-5 as timestamp),tzname),'TZD') 从v $ timezone_names中 - 现在有趣的问题是,从这些TZD名称中,我们能否说如果看到字母“S”,它意味着它处于节约时间内,或者该模式不是在所有情况下都遵循? - Jim P
此外,当我将结果限制在现在和180天后之间不同的那些结果上时(即它们观察DST),唯一没有在TZD中包括'ST'或'DT'的结果是'Europe/Moscow'和'W-SU',这对我来说可以接受。所以就这样了!谢谢。 - Jim P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接