我使用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();
但是持续时间对象并不是几周,几个月,几年等等。
答案 0 :(得分:1)
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和PR 826。然后PR 825被挑选到2.0.x分支,并且2017年5月22日发布了2.0.2。
答案 1 :(得分:0)
在Jon Skeet的帮助下,这个bug将在NodaTime的2.0.2版本中修复。