Noda时间:Period.Between()返回错误的天数



给定下面的代码片段,为什么最后四个输出周期相同?我希望这些行的Days部分是4、3、2、1,而不是4、4、4和4。这是一个bug还是我遗漏了一些明显的东西?(现在很晚了,我很累,所以很可能是后者。)我用的是Noda Time 1.2.0。

for (int day = 25; day <= 31; day++)
{
var d1 = new LocalDate(2013, 12, day);
var d2 = new LocalDate(2015, 3, 4);
var period = Period.Between(d1, d2);
Debug.WriteLine("Day: {0}, Period: {1}", day, period);
}
// I get the following output:
Day: 25, Period: P1Y2M7D
Day: 26, Period: P1Y2M6D
Day: 27, Period: P1Y2M5D
Day: 28, Period: P1Y2M4D
Day: 29, Period: P1Y2M4D
Day: 30, Period: P1Y2M4D
Day: 31, Period: P1Y2M4D

这是因为周期的计算是如何完成的-从Noda Time中的日期和时间算术:"规则非常简单:一次添加一个组件,从最重要的开始,并在每一步换行/截断。">

因此,当它经过那个二月时,就会缩短到28天。如果你编辑代码从(2013, 3, day)(2013, 5, 4):,你可以看到同样的事情发生,缩短到30天

Day: 25, Period: P1M9D
Day: 26, Period: P1M8D
Day: 27, Period: P1M7D
Day: 28, Period: P1M6D
Day: 29, Period: P1M5D
Day: 30, Period: P1M4D
Day: 31, Period: P1M4D

如果您仅以天为单位获得周期(Period.Between(d1, d2, PeriodUnits.Days)),那么您将获得预期的递减计数:

Day: 25, Period: P434D
Day: 26, Period: P433D
Day: 27, Period: P432D
Day: 28, Period: P431D
Day: 29, Period: P430D
Day: 30, Period: P429D
Day: 31, Period: P428D

最新更新