NodaTime 的 2 个日期之间的部分负周期

Partly negative period between 2 dates with NodaTime

我使用 NodaTime 库来获取两天之间的经期,但有时我会在两个日期之间得到部分负周期:

var start = DateTime.Now;
var end = start.AddDays(7).AddMinutes(-1);

//6 days, 24 hours and -1 minutes
var period = Period.Between(LocalDateTime.FromDateTime(start), LocalDateTime.FromDateTime(end));

如何防止此类行为? 目前我已经找到了一个解决方案:

//6 days, 23 hours and 59 minutes, but no weeks, months, years
var duration = period.ToDuration();

但持续时间对象不包含周、月、年等。

在 Jon Skeet 的帮助下,这个错误将在 NodaTime 2.0.2 版本中修复。

TL;DR:更新到 Noda Time 2.0.2。

这是 Noda Time 2.0.0 和 2.0.1 中的一个错误。简短测试表明这在早期版本中不是问题。

问题是由于在尝试获取两个 LocalDateTime 值之间的时间段的时间部分时进行了优化。考虑使用所有单位找出这些值之间的差异:

start: 2017-05-22T12:00:00
end:   2017-05-25T11:30:00

我们首先找到天数部分:2 天(不是 3 天,因为那样会过冲)。这将使我们找到介于以下之间的时间单位:

updated-start: 2017-05-24T12:00:00
end:           2017-05-25T11:30:00

当尝试计算小时数时,它会先计算两个日期之间的天数,然后乘以 24,然后乘以结果之间的小时数 - 所以我们最终得到 24小时,然后超过 30 分钟。

此问题的修复基本上是对 Period 的大修 - 请参阅 PR 825 and PR 826。然后 PR 825 被挑选到 2.0.x 分支,2.0.2 于 2017 年 5 月 22 日发布。