【问题标题】:LocalDate interval in Joda-timeJoda 时间的 LocalDate 间隔
【发布时间】:2011-05-22 05:08:28
【问题描述】:

Joda-time 有一个Interval 类,它介于DateTimes 之间。 LocalDates 的范围可以使用什么?

我想要一个对象,例如“从 2011 年 1 月 1 日到 2011 年 10 月 1 日”,而没有时间(或时区)出现在图片中。

据我所知,joda-time 没有为此内置任何东西。 如果它不存在任何东西,我们会创建它,它应该是什么样子?最重要的是,它可以实现 joda-time 的哪些接口以最好地集成到其他类型中,并与 joda-time 设计保持一致? 实现ReadableInterval 是否有意义,其中getStartgetEnd 返回DateMidnight

【问题讨论】:

    标签: java jodatime


    【解决方案1】:

    编辑:糟糕,之前误读了。

    不,据我所知,在 Joda Time 中没有任何对等的东西。

    就我个人而言,我会创建自己的课程,其中包括开始和结束日期:LocalDateInterval 或类似的东西。我不会为此重用Interval,因为这会混淆概念:一对LocalDate代表两个瞬间,作为本地日期并不是真正的瞬间。

    我个人认为Interval 在 Joda Time 中并不是特别有用...我一直在考虑将其从 Noda Time 中删除。现在听起来我不应该;)

    【讨论】:

    • 但我需要的不是持续时间,而是特定的间隔。例如:从 2011 年 1 月 1 日到 2012 年 10 月 1 日。我将编辑问题以澄清
    • 哦,对不起,我现在和你在一起。
    • 什么是野田时间?那是 Jon Skeet 的个人日期时间库吗?
    • 你不应该删除它。至少经常使用java版本的interval类
    • @Olivier:真的吗?我个人没有使用过它,我也看不出它非常有用......不过我想这取决于你的用例。
    【解决方案2】:

    Interval 类表示从一毫秒瞬间到另一瞬间的时间间隔(包含时区)。 DateMidnight 就是这样一个瞬间。因此,您提议的 DateMidnights 间隔的实现已经存在。

    Interval i = new Interval(
        new DateMidnight(2010, 3, 2), new DateMidnight(2010, 3, 5));
    
    i.contains(new DateTime(2010, 3, 1, 23, 59, 59, 999)); // == false
    i.contains(new DateTime(2010, 3, 2, 0, 0, 0, 0)); // == true
    i.contains(new DateTime(2010, 3, 4, 23, 59, 59, 999)); // == true
    i.contains(new DateTime(2010, 3, 5, 0, 0, 0, 0)); // == false
    

    但是,LocalDates 又名 Partial(无时区)的搜索区间的概念尚不存在。如果您要自己实现它,则根本不要实现任何间隔接口。它会干扰你的意愿,因为如前所述,它是基于瞬间的。

    【讨论】:

    • 与午夜相关的类和方法在 Joda-Time 2.3 中被方法 withTimeAtStartOfDay 替换。
    【解决方案3】:

    请注意,使用DateMidnight 将在 DST 开关处失败。最好使用date.toDateTimeAtStartOfDay()进行转换。

    【讨论】:

    • 你能举一个具体的例子说明它会失败吗?
    【解决方案4】:

    我也需要 LocalDate 对象的间隔,但 JodaTime 不支持。 所以我必须创建自己的实现。后来我决定稍微完善一下并开源。

    您可以查看:https://github.com/serddmitry/joda-interval(在 Maven Central 上可用)。

    【讨论】:

      【解决方案5】:

      我个人使用 Guava 的 Range 类。

      它支持开放式范围。也可以指定包含或排除的边界。在其他众多可能性中,它们可以轻松表示“日期之前”或“日期之后”。

      开放式区间示例。

      Range<LocalDate> before2010 = Range.atMost(new LocalDate("2009-12-31"));
      Range<LocalDate> alsoBefore2010 = Range.lessThan(new LocalDate("2010-01-01"));
      

      它还提供了简单的测试谓词,例如 contains 和 containsAll,以及一个交集操作。所有这些都经过测试和维护。

      【讨论】:

        【解决方案6】:
        public class LocalDateInterval {
        
           private LocalDate begin;
           private LocalDate end;
        
           public LocalDateInterval(LocalDate begin, LocalDate end) {
             this.begin = begin;
             this.end = end;
           }
        
        
        
        }
        

        这对我有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-15
          • 2015-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多