如何获取运行我的代码的物理服务器的时区偏移量?内存中没有日期对象或其他对象.
例如,以下代码将输出-4:00:00:
<%= TimeZone.CurrentTimeZone.GetUtcOffset(new DateTime()) %>
Run Code Online (Sandbox Code Playgroud)
什么时候应该-03:00:00因为夏令时
Jon*_*eet 87
new DateTime()会给你1月1日0001,而不是当前的日期/时间.我怀疑你想要当前的 UTC偏移...这就是你没有在当前代码中看到夏令时偏移的原因.
我会使用TimeZoneInfo.Local而不是TimeZone.CurrentTimeZone- 它可能不会影响事物,但它绝对是一种更好的方法.TimeZoneInfo应该TimeZone在所有代码中取代.然后你可以使用GetUtcOffset:
var offset = TimeZoneInfo.Local.GetUtcOffset(DateTime.UtcNow);
Run Code Online (Sandbox Code Playgroud)
(使用也DateTime.Now 应该工作,但是当现在有夏令时转换时,它涉及幕后的一些魔法.DateTime 实际上有四种而不是广告的三种,但它更简单,只是为了完全避免使用UtcNow.)
或者当然你可以使用我的Noda Time库而不是所有这些BCL垃圾;)(如果你做了很多日期/时间的工作,我会彻底推荐 - 显然 - 但如果你只是做这一点,这可能是矫枉过正的.)
Kas*_*man 16
从.NET 3.5开始,您可以使用以下DateTimeOffset命令获取当前偏移量.
var offset = DateTimeOffset.Now.Offset;
Run Code Online (Sandbox Code Playgroud)
GetUtcOffset使用new DateTime()和使用的方式似乎有些不同DateTime.Now.当我在中央时区运行时,我得到:
TimeZone.CurrentTimeZone.GetUtcOffset(new DateTime()) // -06:00:00
TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now) // -05:00:00
Run Code Online (Sandbox Code Playgroud)
这有点像kludge,但我想你也可以这样做:
DateTime.Now - DateTime.UtcNow // -05:00:00
Run Code Online (Sandbox Code Playgroud)