我执行以下操作:
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我在那里做错了什么?
答案 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);
当您真正想要的是时区信息时,无需获取或转换时间。第一行获得"正常"当地时间偏差;第二个得到了现在'如果您的时区需要夏令时或其他调整。