为什么 DateTime.AddMonths(3).AddMonths(3); 给出与 DateTime.AddMonths(6); 不同的结果?

Bla*_*own 2 c# datetime

我有一个单元测试,其中预期结果是 DateTime 并设置如下:

var expectedResult = DateTime.Today.AddMonths(3).AddMonths(3);
Run Code Online (Sandbox Code Playgroud)

之后我有一个函数可以为日期添加季度:

DateTime.AddMonths(3 * numberOfTimes);
Run Code Online (Sandbox Code Playgroud)

numberOfTimes在本例中是 2。

结果因日期而异。今天是 31/01/2023,预期结果是 30/07/2023,函数结果是 31/07/2023。

我预计结果会相同,因为从开始日期算起 6 个月应该是相同的天数。我很好奇为什么会发生这种情况。现在,我通过在预期结果部分中执行 3 * numberOfTimes 解决了该问题。

只是出于好奇为什么会发生这种情况?

Tim*_*ter 8

记载:

AddMonths方法计算结果月份和年份,同时考虑闰年和一个月中的天数,然后调整结果 DateTime 对象的日期部分。如果结果日不是结果月中的有效日,则使用结果月的最后一个有效日。例如,对于非闰年,3 月 31 日 + 1 个月 = 4 月 30 日,3 月 31 日 - 1 个月 = 2 月 28 日,对于闰年,3 月 31 日 - 1 个月 = 2 月 29 日。

因此,您会得到不同的结果,因为如果添加 6 个月,则只需检查 31/07/2023 是否是有效的日期时间(确实如此)。因为DateTime.Today.AddMonths(3).AddMonths(3)它会首先检查 31/04/2023 是否有效,否则无效,因此返回 30/04/2023,然后添加 3 个月。