我该如何获取运行我的代码的物理服务器的时区偏移量?不是某个日期对象或内存中的其他对象。
例如,以下代码将输出-4:00:00
:
<%= TimeZone.CurrentTimeZone.GetUtcOffset(new DateTime()) %>
由于夏令时的影响,应该是-03:00:00
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垃圾 ;)(如果你正在做很多日期/时间工作,我强烈推荐使用它 - 显然 - 但如果你只是做这一点,那么可能过于复杂。)
TimeZone
实际上已被弃用,并且如果我没记错的话,它无法处理规则中的历史更改。如果可能的话,我真的强烈建议您使用TimeZoneInfo
。 - Jon Skeet使用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
new DateTime()
没有指定 Kind
,而 DateTime.Now
是 Local
。尽管 TimeZone.CurrentTimeZone.GetUtcOffset(TimeZone.CurrentTimeZone.ToLocalTime(new DateTime()))
无论如何都会返回相同的偏移量。 ;) - AndrewDateTime.Now - DateTime. UtcNow
,请记住,由于两个获取器的不同执行时间,实际时区差异可能会多或少几毫秒。 - AndrewDateTime
对象时,它会得到DateTime.MinValue
。 当你使用TimeZone.CurrentTimeZone.GetUtcOffset
获取它的时区时,你实际上得到的是该日期的时间偏移量。DateTime.Now
,你将得到当前的日期和时间,因此也是当前的偏移量。
TimeZone.IsDaylightSavingTime
检查您的服务器是否适用于夏令时。 - Habib