在C#中减去UTC和非UTC DateTime

时间:2016-10-12 07:38:01

标签: c# datetime timespan

我假设在减去2个日期时,框架会检查他们的时区并进行适当的转换。

我用这段代码测试了它:

-00:00:00.0020002
-00:00:00.0020001
01:59:59.9989999

输出:

DateTime.Now - DateTime.UtcNow

令我惊讶的是,DateTime.UtcNow没有自动进行适当的转换。与此同时,DateTime.UtcNow.ToUniversalTime()ToUniversalTime()相同,因此显然有一些内部标记表示时区。

这是否正确,即使信息已经存在,该框架是否也不会自动执行适当的时区转换?如果是,那么对于UTC和非UTC日期时间是否适用ToUniversalTime()安全,即plata不会错误地纠正已经的UTC日期时间?

2 个答案:

答案 0 :(得分:6)

类型System.DateTime不包含时区信息,只有.Kind属性指定它是本地还是UTC。但在.NET 2.0之前,甚至没有.Kind属性。

当您减去(或执行其他算术,如==>时)两个DateTime值,它们的"种类"根本没有考虑。仅考虑刻度数。这在no kinds existed时提供与.NET 1.1的兼容性。

您要求(并期望)的功能是更新更丰富的type System.DateTimeOffset。特别是,如果你进行减法DateTimeOffset.Now - DateTimeOffset.UtcNow,你会得到你想要的结果。 DateTimeOffset结构没有本地/ UTC标志;相反,它包含整个时区,例如您所在地区的+02:00。

答案 1 :(得分:0)

如果日期已经是UTC,则框架不对日期做任何事情:

for