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

use*_*419 47 .net c#

如何获取运行我的代码的物理服务器的时区偏移量?内存中没有日期对象或其他对象.

例如,以下代码将输出-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垃圾;)(如果你做了很多日期/时间的工作,我会彻底推荐 - 显然 - 但如果你只是做这一点,这可能是矫枉过正的.)

  • @ user1886419:是的,这并不让我感到惊讶 - 但是`TimeZone`实际上已经被弃用了,而IIRC它并没有应对规则的历史变化.如果可能的话,我真的强烈建议您使用`TimeZoneInfo`. (3认同)
  • 无耻的插头是贴切的。Noda Time 只是让*有意义* 使这成为一个非问题。 (2认同)

Kas*_*man 16

从.NET 3.5开始,您可以使用以下DateTimeOffset命令获取当前偏移量.

var offset = DateTimeOffset.Now.Offset;
Run Code Online (Sandbox Code Playgroud)

MSDN文档

  • @Naga问题是问如何获取服务器偏移量。有一个[单独的问题](/sf/ask/3259275281/)关于如何在任意时区获取“现在”。 (2认同)

p.s*_*w.g 6

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)

  • 是的,存在差异 - 因为时区现在可能与现在的偏移和0001年1月初的偏移之间存在差异. (4认同)
  • 关于`DateTime.Now - DateTime.UtcNow`,请记住,由于两个getter 的执行时间不同,实际时区差异可能会有几分之一毫秒。 (2认同)