我想确定夏令时是否处于活动状态,但与我的服务器所在的区域不同。
我的问题是我想检查伦敦的夏令时,而我的服务器在加拿大;是否可以找到不同时区的夏令时?
我想确定夏令时是否处于活动状态,但与我的服务器所在的区域不同。
我的问题是我想检查伦敦的夏令时,而我的服务器在加拿大;是否可以找到不同时区的夏令时?
您需要部署 DST 表并查找所需区域的 DST 时间。DST 由各种组织发布并定期更新。你需要明白的是,夏令时不是算法确定的,只能按照各个地区的立法机构的规定查,而且变化频繁。例如这里是当前的 2013 DST 表。将应用程序的 DST 查找表保持在当前状态将是您的应用程序的一项定期任务。
最好的办法是使用两个常见的时区数据库之一。
但是,似乎(根据这个问题)很难使用 SQL Server 中的 Microsoft TimeZone 数据库,因为TimeZoneInfo
该类标记有一个设置为 true的[HostProtection]
属性。MayLeakOnAbort
我相信一个可能的解决方案是使用NodaTime类。这些应该可以从 SQL CLR 访问,并提供对这两个数据库的访问。
我会试试这个,完成后在这里更新。
更新
在与 SQL CLR 的安全限制作斗争后,我得出结论,这种方法目前也不可行。
我目前的建议是在您的应用程序逻辑中在数据库之外进行时区转换。
这是 SQL Server 的粗略 IsDST……</p>
CAST((DATEPART(month, DATEADD(week, -1, <DateTime>)) + 2) % 13 / 5 AS bit) AS IsDST
标准时间 11 月 8 日至 3 月 7 日的产量为 0,日光时间 3 月 8 日至 11 月 7 日的产量为 1。
在 SQL Server 2016 上:
使用 sys.time_zone_info 现在,您可以查询特定时区当前是否在 DST 上。
select * from sys.time_zone_info
这里有一个示例结果
name current_utc_offset is_currently_dst
Aleutian Standard Time -09:00 1
Hawaiian Standard Time -10:00 0
Marquesas Standard Time -09:30 0
Alaskan Standard Time -08:00 1