我假设当减去2个日期时间时,框架将检查其时区并进行适当的转换。

我用以下代码对其进行了测试:

Console.WriteLine(DateTime.Now.ToUniversalTime() - DateTime.UtcNow.ToUniversalTime());
Console.WriteLine(DateTime.Now.ToUniversalTime() - DateTime.UtcNow);
Console.WriteLine(DateTime.Now - DateTime.UtcNow);

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

令我惊讶的是,DateTime.Now - DateTime.UtcNow不会自动进行适当的转换。同时,DateTime.UtcNowDateTime.UtcNow.ToUniversalTime()相同,因此显然有一些内部标志指示时区。

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

最佳答案

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

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

您要求(并期望)的功能在更新和更丰富的type System.DateTimeOffset 中。特别是,如果执行减法DateTimeOffset.Now - DateTimeOffset.UtcNow,则会得到所需的结果。 DateTimeOffset结构没有本地/UTC标志。而是保留了整个时区,例如您所在地区的+02:00。

关于c# - 用C#减去UTC和非UTC日期时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39993030/

10-11 22:26
查看更多