我已经看到了利用当前本地时区的解决方案。如果我正在寻找不是我自己的时区的偏移,目前正在观察日光储蓄时间?
编辑:我意识到很难确切地推断我的要求。
当前在系统中设置用户时,他们选择一个时区。我们所有的数据都转换为他们选择的这个时区(使用偏移(。
示例:用户选择UTC-8,但随后转移到UTC-6的某个地方。我们将显示数据并根据UTC-8偏移量转换。这里的问题是,当日光节省在此时区时,它实际上是UTC-7。根据可用的信息,我可以为UTC-8获得TimeZoneInfo。我知道我可以从TimeZoneInfo.Adjustmentrule中推断出来,以确定我们目前是否正在观察日光节省,以及三角洲。我很好奇框架中是否有东西在重新发明轮之前会为我处理它。
。注意:这是一个Web应用程序。TimeZoneInfo聚集在服务器端,并传递用户的偏移量,因此我们可以将UTC转换为用户选择的时区首选项。我同意,如果用户的浏览器客户端提供其系统时区会更容易,但是使用浏览器的时区是不可行的,因为用户希望根据他们选择的时区查看信息。
您需要使用TimeZoneInfo类。我怀疑您的问题有些错误。偏移通常是名称本身的一部分,通常不是一个非常有趣的事实。它的有用性来自您然后从中推断出来的。
您可能会问:
- 给定时间x在时区y中,在UTC中几点钟
- 给定时间x在时区y中,我本地时区几点钟
- 给定时间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更新。