6

例如,如果我有以下代码:

var nodaStart = new LocalDate(2012, 5, 1);
var nodaEnd = new LocalDate(2012,5,2);
var daysBetween = Period.Between(nodaStart, nodaEnd,PeriodUnits.Day);

然后daysBetween.Days == 1

但是,我计算的范围需要算作 2 天。即它需要包括开始和结束日期。

实际方法可以取开始和结束日期(相隔不超过一年),并且需要计算天数。如果超过 31 天,则将剩余的天数作为整周数返回。

我的逻辑工作正常,但因为计数是唯一的,所以我有一天会出去。

我想我可以在从它startDate.addDays(-1)创建之前做nodaStart,但我想知道是否有更优雅/漂亮的方式让 noda 返回期间。

谢谢


更新:我已经阅读了该类的源代码,并且运算符已重载,因此我可以添加Period+

daysBetween += Period.FromDays(1);
4

2 回答 2

6

(对不起,我花了这么长时间才回答这个问题——我以前没见过。)

任何一个:

  • 在计算之前添加一天结束(这是最合乎逻辑的方法,IMO - 正如罗杰所说,你想要第二天的开始,有效地)
  • 在计算之前从开始减去一天
  • 将结束的天数加 1

应该没事。我不认为 N​​oda Time 会改变以使这变得更简单。Between是减法运算符的一种“模糊单位”版本 - 您不会找到许多 2 - 1 为 2 的减法运算符。

于 2012-11-11T21:23:52.043 回答
0

对于“模糊”大脑的人类,如果它标识一天、一周、一个月等(参见整数倍),我们可能会考虑包含开始和结束日期的天数,因此您可以对其进行编码:

var start = new NodaTime.LocalDateTime(s.Year, s.Month, s.Day, s.Hour, s.Minute);
var end = new NodaTime.LocalDateTime(e.Year, e.Month, e.Day, e.Hour, e.Minute);

NodaTime.Period periodInclusive = NodaTime.Period.Between(start, end.PlusDays(1), NodaTime.PeriodUnits.AllDateUnits);
NodaTime.Period period =  NodaTime.Period.Between(start, end, NodaTime.PeriodUnits.AllDateUnits);
bool isInclusivePeriod = periodInclusive.Days + periodInclusive.Weeks + periodInclusive.Months + periodInclusive.Years < 
                         period.Days + period.Weeks + period.Months + period.Years;

period = isInclusivePeriod ? periodInclusive : period;
// do stuff with period here....
于 2017-10-16T10:38:55.577 回答