使用 NodaTime 计算包含天数期间
本文关键字:包含天 NodaTime 计算 使用 | 更新日期: 2023-09-27 18:32:17
例如,如果我有以下代码:
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 天,则剩余时间将作为整周数返回。
我的逻辑工作正常,但由于计数是排他性的,所以我有一天会出去。
我想我可以在从中创建nodaStart
之前做startDate.addDays(-1)
,但我想知道是否有一种更优雅/漂亮的方法可以让 noda 返回周期。
谢谢
更新:我已经阅读了 Period
类的源代码,并且 +
运算符已重载,因此我可以添加
daysBetween += Period.FromDays(1);
(对不起,我花了这么长时间才回答这个问题 - 我以前没有见过它。
以下任何一项:
- 在计算之前将一天添加到末尾(这是最合乎逻辑的方法,IMO - 正如罗杰所说,您希望第二天有效地开始)
- 在计算之前从开始减去一天
- 在你离开终点的天数上加 1
应该没问题。我不认为野田时间会改变,让这件事变得更简单。 Between
是一种减法运算符的"模糊单位"版本 - 你不会找到很多 2 - 1 是 2 的减法运算符。
对于"模糊"的大脑人类,如果它标识了一天、一周、一个月等(参见整数倍),我们可以认为几天包含开始和结束日期,所以你可以编码它:
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....