我假设当减去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.UtcNow
与DateTime.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/