如何在NodaTime中准确表示日期范围?

时间:2013-12-15 19:51:47

标签: c# .net nodatime

目标

我有一个LocalDate项列表,代表开始日期和结束日期。

我希望能够存储日期范围,以便我可以对它们进行操作,作为一组重叠或不同的范围等。

问题

  • NodaTime是否提供了我在文档中遗漏的某种DateRange构造?
  • 我在想这个错吗?有没有更自然/首选的方法来实现NodaTime已经允许的?
  • 我是否通过尝试使用LocalDate考虑日期范围作为开始日期和结束日期来解决问题?

我对NodaTime完全不熟悉,并认为这对我来说是一个概念上的误解。

更新:我从2009年开始注意到a similar question这个主题,但这似乎是指另一个实用类;我假设从那时起NodaTime可能已经发展到适应这种情况。

1 个答案:

答案 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;
    
  • 不,创建范围类本地日期没有任何问题,可能没有太大的优势。您可以通过在自己的类上拥有两个属性StartDateEndDate来做同样的事情。请注意结束日期的包容性,以及您在间隔或时间范围内看到的排他性。

最后,你说:

  

...这样我就可以对它们进行操作,作为一组重叠或不同的范围等。

你可能正在寻找交叉,联合,计算间隙,排序等操作。这些和更多是由Time Period Library定义的,但Noda Time目前没有这样的东西。如果要创建它,它可能应该在一个伴随库(“NodaTime.Ranges”,也许?)。可能不希望将它拉入核心,但你永远不会知道......

如果您最终使用该时间段库,请确保您认识到它仅适用于DateTime,并且完全无视DateTimeKind。因此,为了提高效率,您应该确保只使用UTC值或“未指定”的日历日期,并尽量不要问“一天中有多少小时”这样的事情,因为它会得到夏令时转换的日子是错误的。