如何获取运行我的代码的物理服务器的时区偏移量?不是内存中的某个日期对象或其他对象。
例如,以下代码将输出-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 垃圾;)(如果你正在做很多日期/时间工作,我会彻底推荐 - 显然 - 但如果你只做这一点,这可能是矫枉过正。)
GetUtcOffset
与new DateTime()
和的工作方式之间似乎存在一些差异DateTime.Now
。当我在中央时区运行它时,我得到:
TimeZone.CurrentTimeZone.GetUtcOffset(new DateTime()) // -06:00:00
TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now) // -05:00:00
这有点麻烦,但我想你也可以这样做:
DateTime.Now - DateTime.UtcNow // -05:00:00
当您签约一个新DateTime
对象时,它会获得DateTime.MinValue
当您获得它时,TimeZone.CurrentTimeZone.GetUtcOffset
您实际上会获得该日期的时间偏移量。如果您使用,DateTime.Now
您将获得当前日期和时间以及当前偏移量。