与NodaTime在2个日期之间的部分负面时期

时间:2017-05-20 15:36:25

标签: c# datetime 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();

但是持续时间对象并不是几周,几个月,几年等等。

2 个答案:

答案 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 825PR 826。然后PR 825被挑选到2.0.x分支,并且2017年5月22日发布了2.0.2。

答案 1 :(得分:0)

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