【问题标题】:How can you determine the timezone offset needed for an arbitrary timezone with respect to daylight savings如何确定任意时区相对于夏令时所需的时区偏移量
【发布时间】:2018-09-13 09:00:34
【问题描述】:

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

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

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

示例: 用户选择 UTC-8,但随后前往 UTC-6 的某个地方。我们将显示数据并根据 UTC-8 偏移量对其进行转换。这里的问题是当夏令时应用于这个时区时,它实际上是 UTC-7。根据可用信息,我可以获得 UTC-8 的 TimeZoneInfo。我知道我可以从TimeZoneInfo.AdjustmentRule 推断出我们当前是否正在观察夏令时,以及增量是什么。我很好奇在重新发明轮子之前,我是否缺少框架中的某些东西可以为我处理这个问题。

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

【问题讨论】:

  • 这个任意时区来自哪里?我的意思是,你怎么知道它不是“你自己的”?
  • 让他们把它发给你。不,这就是大多数基于浏览器的应用程序的工作方式!
  • @IanMercer - OP 并不暗示基于浏览器的应用程序。事实上,了解我们在这里讨论的应用程序类型会很有帮助。
  • @LukeG - 您可能只是在寻找TimeZoneInfo.GetUtcOffset,但请注意,如果您谈论的是 Web 应用程序,您需要知道最终用户的时区 ID。另外 - StackOverflow 上已经有很多关于此的问题。提问前请先搜索。谢谢。
  • @MattJohnson 谢谢!这确实最终成为与使用 DateTimeKind.Unspecified 创建新日期时间混合的问题的关键。 var date = new DateTime(DateTime.Now.Ticks, DateTimeKind.Unspecified);返回 timeZoneInfo.GetUtcOffset(date);

标签: c# .net timezone


【解决方案1】:

您需要使用 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 更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-17
    • 2015-02-04
    • 2016-11-25
    • 2020-07-16
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    相关资源
    最近更新 更多