如何确定任意时区所需的时区偏移,以节省夏令时

时间:2018-04-03 22:45:10

标签: c# .net timezone

我见过使用当前本地时区的解决方案。如果我正在寻找不是我自己的时区的偏移并且目前正在观察夏令时,该怎么办?

编辑: 我意识到很难准确地推断出我要求的东西。

目前,当在系统中设置用户时,他们会选择时区。我们所有的数据都被转换为他们选择的时区(使用偏移量)。

实施例: 用户选择UTC-8,然后前往UTC-6的某个地方。我们将显示数据并根据UTC-8偏移量进行转换。这里的问题是当夏令时应用于这个时区时,它实际上是UTC-7。根据可用信息,我可以获得UTC-8的TimeZoneInfo。我知道我可以从TimeZoneInfo.AdjustmentRule进行推断,以确定我们目前是否正在观察夏令时,以及三角洲是什么。我很好奇,如果在我重复发明轮子之前,我遗漏的框架中有一些东西可以解决这个问题。

注意:这是一个Web应用程序。 TimeZoneInfo在服务器端收集,并传递用户的偏移量,以便我们可以将UTC转换为用户选择的时区偏好。我同意如果用户的浏览器客户端提供了他们的系统时区会更容易,但是由于用户希望基于浏览器的时区而使用浏览器的时区是不可行的(由于业务规则)。他们选择的时区。

1 个答案:

答案 0 :(得分:2)

您需要使用TimeZoneInfo类。我怀疑你的问题有点被误解。偏移量通常是名称本身的一部分,并且它本身通常不是一个非常有趣的事实。它的用处来自你打算从中推断出来的东西。

您可能会问:

  • 在时区Y中给定时间X,UTC中的时间是什么时候
  • 在时区Y给出时间X,在我当地时区的时间是什么时候
  • 在我的时区给定时间X,在时区Y
  • 的当地时间

这是一个首先给出的启动器:

public static DateTime ConvertToUtc(DateTime timeOfInterest, string timezoneId)
{
    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById(timezoneId);
    if (tz.IsInvalidTime(timeOfInterest))
    {
        // Timezones with DST will be missing (usually) an hour one day a year, so some timeOfInterest
        // values are not valid
        throw new ArgumentOutOfRangeException($"{timeOfInterest} is not a valid time in {timezoneId} timezone");
    }
    return TimeZoneInfo.ConvertTimeToUtc(timeOfInterest, tz);
}

如果您愿意,甚至可以将其作为扩展方法。

对于其他功能,另见:

  • tz.IsDaylightSavingTime()
  • tz.GetUtcOffset()
  • tz.SupportsDaylightSavingTime
  • TimeZoneInfo.ConvertTimeFromUtc()
  • TimeZoneInfo.ConvertTime()

最后,请注意这些规则会随着不同的司法管辖区改变有关其遵守时间的法律而一直在变化。确保执行这些计算的任何系统都会获得Windows更新。