我有一个LocalDate
项列表,代表开始日期和结束日期。
我希望能够存储日期范围,以便我可以对它们进行操作,作为一组重叠或不同的范围等。
我对NodaTime完全不熟悉,并认为这对我来说是一个概念上的误解。
更新:我从2009年开始注意到a similar question这个主题,但这似乎是指另一个实用类;我假设从那时起NodaTime可能已经发展到适应这种情况。
答案 0 :(得分:15)
Noda Time为一系列Interval
值提供Instant
类型,但它不为其他类型提供范围类型。部分原因是范围用于不同类型的细微差别。
如果我给你一系列瞬间,它总是被视为半开的间隔。包含起始值,但结束值排除。每当我们提供时间值时,人类就会自然地这样做,例如当我说事件从1:00
运行到2:00
时,显然我的意思是事件是 over at 2 :00,所以2:00被排除在外。
但是对于整个日历日期范围,通常结束日期为包含。为了表示1月的整个月(作为一系列LocalDate
值),我可能会说1月1日到1月31日,我将整个最后一天包括在内。
我们可能会添加一些额外的范围类型来强制执行这些操作,但我们需要考虑将它们放在API中的价值,当您可以根据需要创建它们时。我不是说我支持或反对它,但这可能在Noda Time user group上有争议。
回答您的具体问题:
唯一需要考虑的是日历数学通常是通过Period
类来完成的。例如,要确定两个日历日期之间的天数:
LocalDate ld1 = new LocalDate(2012, 1, 1);
LocalDate ld2 = new LocalDate(2013, 12, 25);
Period period = Period.Between(ld1, ld2, PeriodUnits.Days);
long days = period.Days;
不,创建范围类本地日期没有任何问题,可能没有太大的优势。您可以通过在自己的类上拥有两个属性StartDate
和EndDate
来做同样的事情。请注意结束日期的包容性,以及您在间隔或时间范围内看到的排他性。
最后,你说:
...这样我就可以对它们进行操作,作为一组重叠或不同的范围等。
你可能正在寻找交叉,联合,计算间隙,排序等操作。这些和更多是由Time Period Library定义的,但Noda Time目前没有这样的东西。如果要创建它,它可能应该在一个伴随库(“NodaTime.Ranges”,也许?)。可能不希望将它拉入核心,但你永远不会知道......
如果您最终使用该时间段库,请确保您认识到它仅适用于DateTime
,并且完全无视DateTimeKind
。因此,为了提高效率,您应该确保只使用UTC值或“未指定”的日历日期,并尽量不要问“一天中有多少小时”这样的事情,因为它会得到夏令时转换的日子是错误的。