获取任何时区的 DST 开始和结束日期

Posted

技术标签:

【中文标题】获取任何时区的 DST 开始和结束日期【英文标题】:Get DST Start and End Date for any Timezone 【发布时间】:2018-02-24 22:51:44 【问题描述】:

我看到这个问题问了很多,但没有看到任何实际答案(大多数解决方案专门针对美国时区)。

在给定年份和时区的情况下,SQL Server 中是否可以获取夏令时的开始和结束日期?

总而言之,我正在寻找是否有人为以下两个过程/功能提出了解决方案:

datetime2 getDSTStartDate(@year int, @timeZone varchar)
datetime2 getDSTEndDate(@year int, @timeZone varchar)

【问题讨论】:

对于不执行夏令时的地点...比如整个亚利桑那州呢? 【参考方案1】:

我猜想得到确切的日期是不可能的。有国家和地区的差异,有些地方甚至根本不遵守夏令时。它通常在规定的日期和时间,但在一年中可能会发生变化。那么你的日期时间计算就无关紧要了。

https://www.timeanddate.com/time/dst/2017.html

查看该页面上的第二段:

请注意,此列表可能不是最终列表 - 国家、地区和 各州有时会做出几天或几天内宣布的调整 时间变化提前几周。

仅此声明就表明内部数据库功能很容易过时,以至于毫无意义。

您可以使用过去的日期,因为它们已经完成,但如下图所示,未来的日期虽然现在已经确定,但可能会发生变化并且无法准确预测。

** Country Counts For Last 3 Years **
---------------------------------------------------------------
|                         **2017**                            |
---------------------------------------------------------------
|                DST Observance                 |Count|Example|
---------------------------------------------------------------
|No DST at all                                  | 172 | China |
|At least one location observes DST             |  77 | USA   |
|All locations observe DST some part of the year|  67 | Iran  |
|Many locations observe DST part of the year    |   9 | USA   |
|At least one location observes DST all year    |   1 |       |
|All locations observe DST all year             |   1 | Chile |
---------------------------------------------------------------

---------------------------------------------------------------
|                         **2016**                            |
---------------------------------------------------------------
|                DST Observance                 |Count|Example|
---------------------------------------------------------------
|No DST at all                                  | 171 | China |
|At least one location observes DST             |  77 | USA   |
|All locations observe DST some part of the year|  69 | Iran  |
|Many locations observe DST part of the year    |   8 | USA   |
---------------------------------------------------------------

---------------------------------------------------------------
|                         **2015**                            |
---------------------------------------------------------------
|                DST Observance                 |Count|Example|
---------------------------------------------------------------
|No DST at all                                  | 168 | China |
|At least one location observes DST             |  80 | USA   |
|All locations observe DST some part of the year|  70 | Iran  |
|Many locations observe DST part of the year    |   9 | USA   |
|At least one location observes DST all year    |   1 |       |
|All locations observe DST all year             |   1 | Chile |
---------------------------------------------------------------

注意:由于上述变幻莫测,并且您还必须以编程方式确定用户在哪里输入,最好将日期时间存储为 UTC 或其他格式通用格式并根据需要使用它。 SQL 可能不是解决所有问题的最佳场所。

【讨论】:

为了增加乐趣,大图表末尾的注释说:* Some locations have multiple periods of DST: the start of the first period and end of the last period are listed.

以上是关于获取任何时区的 DST 开始和结束日期的主要内容,如果未能解决你的问题,请参考以下文章

从UTC转换为任何时区

如何确定 DST 何时在 Python 中的特定位置开始或结束? [复制]

R - 从一年中获取夏令时开始和结束

使用pytz查找时区时差

使用 pytz 时区时 Python 日期时间不包括 DST

获取两个日期范围内的上周日(GMT、DST)