C# DateTime对象的奇怪行为

C# DateTime对象的奇怪行为,c#,datetime,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: " +

我做了以下工作:

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();
它给出了以下结果: 如果我把timespan.hours(我实际使用的时间)取为1?
应该是2我做错了什么?

在获取时间之间有一些时间间隔(系统甚至可以在这两个调用之间切换进程):

这就是为什么两个值之间的间隔不到2小时。您应该只获取一次时间,然后将其转换为本地时间:

 var utc = DateTime.UtcNow;
 var now = utc.ToLocalTime();
 // timeSpan: 120
或用于将本地时间转换为UTC时间:

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

原因很简单:您的计算会导致两次时间错误。最终的结果有点错误,但是打电话所花的时间

解决方案更简单

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

当您真正想要的是时区信息时,不需要获取或转换时间。第一行获取“正常”本地时间偏移;如果您的时区受到夏令时或其他调整,秒将获得“now”的偏移量。

好的,但奇怪的是控制台中的读数显示精确到毫秒的2小时?但我明白你的意思。感谢您只是一个节点,毫秒的格式不是“…:ms”,您当前的毫秒输出是分+秒。(..:37:42:3742). 改用“yyyy-MM-dd HH:MM:ss.ffff”。
  Console.WriteLine(TimeZoneInfo.Local.BaseUtcOffset.Hours);
  Console.WriteLine(TimeZoneInfo.Local.GetUtcOffset(DateTime.Now).Hours);