64

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

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

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

什么时候应该是-03:00:00因为夏令时

4

4 回答 4

114

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 垃圾;)(如果你正在做很多日期/时间工作,我会彻底推荐 - 显然 - 但如果你只做这一点,这可能是矫枉过正。)

于 2013-07-31T15:34:43.930 回答
36

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

var offset = DateTimeOffset.Now.Offset;

MSDN 文档

于 2017-01-19T21:59:44.640 回答
10

GetUtcOffsetnew 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
于 2013-07-31T15:34:26.967 回答
0

当您签约一个新DateTime对象时,它会获得DateTime.MinValue 当您获得它时,TimeZone.CurrentTimeZone.GetUtcOffset您实际上会获得该日期的时间偏移量。如果您使用,DateTime.Now您将获得当前日期和时间以及当前偏移量。

于 2013-07-31T15:41:13.243 回答