DateTime对象的奇怪行为

时间:2014-06-04 12:42:33

标签: c# datetime

我执行以下操作:

var now = DateTime.Now;
var utc = DateTime.UtcNow;
var timeSpan = now - utc;

Console.WriteLine("Now is: " + now.ToString("yyyy-MM-dd HH:mm:ss:ms") + " utc is: " + utc.ToString("yyyy-MM-dd HH:mm:ss:ms") + " timeSpan: " +
                    timeSpan.TotalMinutes);

Console.ReadKey();

它给出了以下结果: Console 如果我采用timespan.hours(这是我实际使用的那个)它会显示1? 应该是2我在那里做错了什么?

2 个答案:

答案 0 :(得分:6)

您获得时间之间会有一段时间(系统甚至可以在这两个呼叫之间切换进程):

 var now = DateTime.Now;
 // some time passes here
 var utc = DateTime.UtcNow;

这就是为什么两个值之间的时间少于2小时。你应该只花一次时间,然后转换为当地时间:

 var utc = DateTime.UtcNow;
 var now = utc.ToLocalTime();
 // timeSpan: 120

或使用TimeZoneInfo.ToUniversalTime将本地时间转换为UTC时间:

 var now = DateTime.Now;
 var utc = TimeZone.CurrentTimeZone.ToUniversalTime(now);

答案 1 :(得分:0)

原因很简单:您的计算会花费两次时间来引入错误。最终结果略有错误,但是拨打电话需要一段时间。

解决方案更简单。

  Console.WriteLine(TimeZoneInfo.Local.BaseUtcOffset.Hours);
  Console.WriteLine(TimeZoneInfo.Local.GetUtcOffset(DateTime.Now).Hours);

当您真正想要的是时区信息时,无需获取或转换时间。第一行获得"正常"当地时间偏差;第二个得到了现在'如果您的时区需要夏令时或其他调整。