C# 如何确定任意时区相对于夏令时所需的时区偏移

C# 如何确定任意时区相对于夏令时所需的时区偏移,c#,.net,timezone,C#,.net,Timezone,我见过利用当前本地时区的解决方案。如果我正在寻找一个时区的偏移量,而这个时区不是我自己的,并且目前正在遵守夏令时,该怎么办 编辑: 我意识到很难准确地推断出我想要什么 当前,在系统中设置用户时,他们会选择时区。我们所有的数据都会转换到他们选择的时区(使用偏移量) 例如: 用户选择UTC-8,但随后前往UTC-6所在的位置。我们将显示数据并根据UTC-8偏移量进行转换。这里的问题是,当夏时制应用于这个时区时,实际上是UTC-7。根据可用信息,我能够获得UTC-8的时区信息。我知道我可以从中推断,以

我见过利用当前本地时区的解决方案。如果我正在寻找一个时区的偏移量,而这个时区不是我自己的,并且目前正在遵守夏令时,该怎么办

编辑: 我意识到很难准确地推断出我想要什么

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

例如: 用户选择UTC-8,但随后前往UTC-6所在的位置。我们将显示数据并根据UTC-8偏移量进行转换。这里的问题是,当夏时制应用于这个时区时,实际上是UTC-7。根据可用信息,我能够获得UTC-8的时区信息。我知道我可以从中推断,以确定我们目前是否在观察夏时制,以及三角洲是什么。我很好奇,在我重新发明轮子之前,我所缺少的框架中是否有什么东西可以帮我解决这个问题


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

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

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

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