如何从时区名称中获取时区偏移量

Posted

技术标签:

【中文标题】如何从时区名称中获取时区偏移量【英文标题】:How to get timezone offset from the timezone name 【发布时间】:2021-04-11 22:47:01 【问题描述】:

我在 SQL Server 数据库中保存了一个时区名称,例如 America/Vancouver。 我想从 SQL 中的时区名称中获取 UTC 偏移量,例如 America/Vancouver-08:00 偏移量。那么如何在 SQL 中编写查询呢? 非常感谢您的帮助

【问题讨论】:

UTC 偏移量在什么时刻?美国/温哥华在 UTC-7 和 UTC-8 之间变化。这是一个相对简单的情况,因为据我所知,它永远具有相同的 标准 时间......但是例如,继续“永久夏令时”的时区呢? (这就是未来几年欧盟很多国家可能会做的事情......所以欧洲/巴黎目前在 UTC+1 和 UTC+2 之间变化,但未来可能会永久为 UTC+2。) @JonSkeet 我需要你提到的夏令时偏移量,基本上,我在 SQL 表中有一个用户可用时间为 12:00 到 04:00,用户时区在 America/Vancouver 所以我必须检查工作 UTC 时间和工作人员的可用时间,所以我需要将 UTC 时间转换为工作人员时区并比较时隙 当您说“工作 UTC 时间”时 - 您已经将其作为特定值了吗?所以问题实际上是“如何使用 IANA 时区 ID 将特定时刻转换为时区?” (最好编辑问题以明确这一点。)我不知道 SQL Server 是否 any 直接支持 IANA 时区 - 您可能需要从 IANA 时区 ID 转换首先进入 Windows 时区 ID,此时您可以使用“AT TIME ZONE”。 您已标记 SQL Server 2005 和 21008 - 您使用的是哪个? 【参考方案1】:

将 DATEPART 与 TZ 参数一起使用。示例:

SELECT DATEPART(tz, (CAST('2021-01-01' AS DATETIMEOFFSET) AT TIME ZONE 'Central European Standard Time')); 

结果以分钟为单位。

【讨论】:

【参考方案2】:

不幸的是,SQL Server 尚不直接支持 IANA 时区标识符(如 America/Vancouver)。目前,最好的选择是将 IANA 标识符转换为应用层中相应的 Windows 时区标识符,并将其存储在 SQL Server 中。

例如,如果您在应用程序层中运行 .NET,则可以使用我的 TimeZoneConverter 项目:

string tz = TZConvert.IanaToWindows("America/Vancouver");
// Result:  "Pacific Standard Time"

然后你可以在你的 SQL Server 代码中使用AT TIME ZONE 函数:

SELECT sysdatetimeoffset() AT TIME ZONE 'Pacific Standard Time'

上面将为您提供给定时区的当前日期、时间和偏移量,您可以将其用作查询用户可用性的基础(在问题 cmets 中提到)。

请注意,根据夏令时是否生效,偏移调整会有所不同。尽管 Windows 标识符中有“标准”一词,但在适用的情况下确实考虑了 DST。

或者,如果由于某种原因您必须完全在 SQL Server 中执行此操作而不转换到 Windows 时区,那么您将需要依赖诸如我的 SqlServerTimeZoneSupport 项目之类的项目。那个有点旧,维护得也不是很好,所以如果你能提供帮助,我建议不要使用这种方法。

【讨论】:

以上是关于如何从时区名称中获取时区偏移量的主要内容,如果未能解决你的问题,请参考以下文章

.NET 通过时区名称获取时区偏移量

如何使用 pytz 从时区字符串中获取 UTC 偏移量?

在不使用字符串的情况下在 javascript 中获取另一个时区的时区偏移量

如何在Elm中以GMT显示当前时区偏移量

iOS - 如何获取时区的原始偏移量?

pytz 时区的 STD 偏移量