调用带有整数的DateTime.AddDays总是保持时间不变?

Jon*_*der 5 .net c# time datetime

考虑以下代码,试图获得DateTime相当于当地时间"昨天午夜"的代码:

DateTime midnightYesterday = DateTime.Today.AddDays(-1.0d);
Run Code Online (Sandbox Code Playgroud)

总是会导致DateTime时间分量为00:00:00 - 无论是闰日,闰秒还是本地时区等任何角落情况?

更一般地说:调用DateTime.AddDays,将整数作为参数传递,总是会导致DateTime返回的元素与原始元素完全相同Datetime吗?

DateTime.AddDaysMSDN文档未解决此特定问题.

Evk*_*Evk 7

  1. DateTime不考虑闰秒.您可以阅读本文,您将从中看到,因为它并不真正支持UTC.文件指出:

时间值以称为刻度的100纳秒单位进行测量,特定日期是格里高利历日历中自公元0001年1月1日午夜12点起的刻度数(不包括闰秒添加的刻度)

  1. 关于夏令时文档说明如下:

时区之间的转换操作(例如在UTC和本地时间之间,或在一个时区和另一个时区之间)将夏令时考虑在内,但算术和比较操作则不会.

这意味着向DateTime实例添加天数(即算术运算),即使它具有种类Local(因此表示在本地时区中的时间)也不会考虑DST.这使得在日期时间执行任何算术运算都是Local一个非常糟糕的主意.如果您需要使用日期时间 - 首先将其转换为UTC(没有DST概念),执行操作然后转换回本地(如上所述的转换确实考虑了DST).

您还可以查看源代码,以查看日期时间值是否在内部存储为数字(刻度数),添加天数只是将固定值添加到该数字.计算小时\分钟\秒使用该值并执行固定操作(仅一个除法)以获得目标值.这些操作都不会占用闰秒,时区或其他任何内容.所以你的问题的答案是肯定的.