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

标签 c# datetime

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

var expectedResult = DateTime.Today.AddMonths(3).AddMonths(3);

之后,我有一个将季度添加到日期的函数:

DateTime.AddMonths(3 * numberOfTimes);

numberOfTimes 在本例中为 2。

结果在日期上有所不同。今天是 31/01/2023,预期结果是 30/07/2023,函数结果是 31/07/2023。

我预计结果会相同,因为 6 个月应该与开始日期的天数相等。我很好奇为什么会这样。现在,我通过在 expectedResult 部分执行 3 * numberOfTimes 来解决问题。

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

最佳答案

documented :

The AddMonths method calculates the resulting month and year, taking into account leap years and the number of days in a month, then adjusts the day part of the resulting DateTime object. If the resulting day is not a valid day in the resulting month, the last valid day of the resulting month is used. For example, March 31st + 1 month = April 30th, and March 31st - 1 month = February 28 for a non-leap year and February 29 for a leap year.

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

关于c# - 为什么 DateTime.AddMonths(3).AddMonths(3);给出与 DateTime.AddMonths(6) 不同的结果;?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75296217/

相关文章:

datetime - 将日期时间集合转换为 yyyy-mm-dd

MySQL - 如果 ID 和时间戳在时间范围内唯一的组合约束,则防止插入记录

mysql "ERROR 1292 (22007): Truncated incorrect time value: ' 2355 :46:39. 00000 0'"插入时

c# - Unity - 根据某些条件解决依赖关系

c# - Delegate 是指向函数的指针?还保存变量?

c# - 2维数组的linq

c# - 从所有套接字接收消息而不循环遍历所有套接字

python-2.7 - 如何解析这个 "TypeError: cannot concatenate ' str' 和 'datetime.time' 对象”

c# - 使用 JavaScript 从 ASP.NET 代码文件调用函数

c# - 将 ETA 添加到嵌入式循环序列