Noda Time:Period.Between返回不正确的值

我在使用NodaTime lib时遇到了麻烦。 我的目标:计算两个日期之间的年/月/日。 所以,这是我的测试示例:

private static void Main() { var list = new List<Tuple> { new Tuple(new DateTime(1980, 1, 1), new DateTime(1983, 12, 31)), new Tuple(new DateTime(2009, 1, 1), new DateTime(2015, 01, 23)) }; var totalPeriod = Period.Zero; foreach (var tuple in list) { var dateFrom = tuple.Item1; var dateTo = tuple.Item2; var ld1 = new LocalDate(dateFrom.Year, dateFrom.Month, dateFrom.Day); var ld2 = new LocalDate(dateTo.Year, dateTo.Month, dateTo.Day); var period = Period.Between(ld1, ld2, PeriodUnits.YearMonthDay); totalPeriod += period; } Console.WriteLine("Years: {0}, Months: {1}, Days: {2}", totalPeriod.Years, totalPeriod.Months, totalPeriod.Days); Console.Read(); } 

输出为: 年:9,月:11,天:52

这对我来说不对。 我想得到,例如,下一个输出(当然,输出取决于月份的天数,假设我们的月份有31天): 年:10,月:0,天:21

所以,我希望这些日子可以分为几年和一个月。 我怎么能得到这个?

答案:使用Matt的答案,我创建了下一个解决方案:

  foreach (var tuple in list) { var dateFrom = tuple.Item1; var dateTo = tuple.Item2; var period = Period.Between(LocalDateTime.FromDateTime(dateFrom).Date, LocalDateTime.FromDateTime(dateTo).Date, PeriodUnits.YearMonthDay); totalPeriod += period; } // trying clarify the period while(totalPeriod.Days >= 30) { totalPeriod = totalPeriod - Period.FromDays(30); totalPeriod = totalPeriod + Period.FromMonths(1); while (totalPeriod.Months >= 12) { totalPeriod = totalPeriod - Period.FromMonths(12); totalPeriod = totalPeriod + Period.FromYears(1); } } 

理查德对OP的评论是正确的。 问题是,月份和年份不是自己的不同数量。 必须有一个参考框架来“计算”它们。 在执行Period.Between操作时,您具有该引用,但在尝试将句点添加到一起时它会丢失。

如果您检查正在添加的期间,则有意义:

 First: Years: 3, Months: 11, Days: 30 Second: Years: 6, Months: 0, Days: 22 Total: Years: 9, Months: 11, Days: 52 

为了按照您的意愿进行舍入,添加到30天的22天将不知何故必须知道哪个月被引用。 即使您保留了原始信息 – 您会使用哪一个? 一方面你可以有28天的月份,另一方面可以有31天的月份。

你可以做的最好的事情就是自己人为地围绕结果,然后选择一个平坦值(例如30天)代表所有月份。

哦,一个小问题(与您的问题无关) – 要从DateTime转到LocalDate ,请尝试LocalDateTime.FromDateTime(dt).Date 。 🙂