在C#中获取服务器的时区偏移量

75

我该如何获取运行我的代码的物理服务器的时区偏移量?不是某个日期对象或内存中的其他对象。

例如,以下代码将输出-4:00:00

<%= TimeZone.CurrentTimeZone.GetUtcOffset(new DateTime()) %>

由于夏令时的影响,应该是-03:00:00


2
你的服务器时区设置正确吗? - mpen
1
使用TimeZone.IsDaylightSavingTime检查您的服务器是否适用于夏令时。 - Habib
4个回答

132

new DateTime() 将会给你 0001 年 1 月 1 日,而不是当前的日期/时间。我猜测你想要当前的UTC偏移量...这就是为什么你在当前代码中没有看到夏令时偏移量。

我建议使用TimeZoneInfo.Local代替TimeZone.CurrentTimeZone - 这可能不会产生影响,但这绝对是更好的方法。TimeZoneInfo应该在所有代码中基本替换TimeZone然后你可以使用GetUtcOffset

var offset = TimeZoneInfo.Local.GetUtcOffset(DateTime.UtcNow);

(使用DateTime.Now应该也可以,但在当前时间有夏令时转换时会涉及一些神奇的事情。实际上,DateTime具有四种类型而不是宣传的三种类型,但是通过使用UtcNow来避免这个问题更加简单。)

当然,你也可以使用我的Noda Time库代替所有这些BCL垃圾 ;)(如果你正在做很多日期/时间工作,我强烈推荐使用它 - 显然 - 但如果你只是做这一点,那么可能过于复杂。)


2
这个不要脸的插件很恰当。Noda Time通过只做有意义的事情来解决这个问题,使其变得无关紧要。 - Paul Turner
1
@Tragedian:谢谢 - 验证总是很好的 :) - Jon Skeet
1
TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now) 对我的目的也有效。 - user1886419
3
@user1886419:是的,这并不让我感到惊讶 - 但是TimeZone实际上已被弃用,并且如果我没记错的话,它无法处理规则中的历史更改。如果可能的话,我真的强烈建议您使用TimeZoneInfo - Jon Skeet

42
自 .NET 3.5 开始,您可以从 DateTimeOffset 使用以下内容获取当前偏移量。
var offset = DateTimeOffset.Now.Offset;

MSDN文档


如果服务器和所需的时区偏移量相同,那么我想这是可以的,否则我们仍然需要使用从TimezoneInfo.FindSystemTimeZoneById返回的对象进行处理。 - Naga
2
@Naga 这个问题是在询问如何获取服务器偏移量。针对如何在任意时区获取“现在时间”的问题,有一个单独的问题 - Kasey Speakman

11

使用new DateTime()DateTime.Now调用GetUtcOffset存在差异。在中央时区运行代码,结果如下:

TimeZone.CurrentTimeZone.GetUtcOffset(new DateTime()) // -06:00:00

TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now)   // -05:00:00

这有点不太优雅,但我想你也可以这样做:

DateTime.Now - DateTime.UtcNow // -05:00:00

4
是的,存在差异- 因为一个时区现在的偏移量和公元1年1月开始时的偏移量可能会有所不同。 - Jon Skeet
@JonSkeet 我猜那就是原因,但我不是完全确定。 - p.s.w.g
同时 new DateTime() 没有指定 Kind,而 DateTime.NowLocal。尽管 TimeZone.CurrentTimeZone.GetUtcOffset(TimeZone.CurrentTimeZone.ToLocalTime(new DateTime())) 无论如何都会返回相同的偏移量。 ;) - Andrew
2
关于 DateTime.Now - DateTime. UtcNow,请记住,由于两个获取器的不同执行时间,实际时区差异可能会多或少几毫秒。 - Andrew

0
当你实例化一个新的DateTime对象时,它会得到DateTime.MinValue。 当你使用TimeZone.CurrentTimeZone.GetUtcOffset获取它的时区时,你实际上得到的是该日期的时间偏移量。
如果你使用DateTime.Now,你将得到当前的日期和时间,因此也是当前的偏移量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接