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

Sea*_*een 9 .net c# nodatime

目标

我有一个LocalDate项目列表,代表开始日期和结束日期的集合.

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

问题

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

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

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

Mat*_*int 16

Noda Time提供Interval一系列Instant值的类型,但它不为其他类型提供范围类型.造成这种情况的部分原因是范围如何用于不同类型的细微差别.

如果我给你一系列的瞬间,它总是被视为半开的间隔.包含起始值,但包括结束值.人类做到这一点自然我们提供了一个时间值,任何时间,例如,当我说一个事件从运行1:002:00,清楚我的意思是,该事件是凌晨2点,所以2:00被排除在外.

但是对于整个日历日期范围,通常结束日期是包含在内的.为了代表1月的整个月(作为一系列LocalDate价值观),我可能会说1月1日到1月31日,我将整个最后一天包括在内.

我们可能会添加一些额外的范围类型来强制执行这些操作,但是我们需要考虑在API中使用它们时可以根据需要创建它们的价值.我不是说我支持或反对它,但这可能是Noda Time用户组的争论点.

回答您的具体问题:

  • 不,本地日期没有预定义的范围类.
  • 唯一要考虑的是日历数学通常是通过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;
    
    Run Code Online (Sandbox Code Playgroud)
  • 不,创建一个范围类的本地日期没有任何问题,可能没有很多优势.你可以通过拥有两个属性,StartDate以及EndDate在你自己的类上做同样的事情.请注意结束日期的包容性,以及您在间隔或时间范围内看到的排他性.

最后,你说:

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

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

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