【问题标题】:Java jsr310: difference between dates and timesJava jsr310:日期和时间之间的差异
【发布时间】:2012-06-26 14:36:07
【问题描述】:

有大量的 SO 问题涉及在 Java 中计算两个日期或两次之间的差异。许多答案指出了核心 Java Date 类的问题,并建议使用 Jodatime,但是 AFAIK,没有人建议如何使用 jsr310 来做到这一点。

那么,在jsr310中有什么方法可以计算两个日期或者两次的差吗?


作为参考,以下问题处理此问题:

在核心 Java 中:

在Jodatime:

【问题讨论】:

    标签: java datetime date jsr310


    【解决方案1】:

    如何做到这一点取决于所使用的日期或日期时间类。

    如果您是实时操作(即使用时区等,因此可以将日期时间精确定位到时间线上的确切 Instant),您可以使用 Duration 类 (javadoc) -例如

    Duration diff = Duration.between(InstantProvider startInc, InstantProvider endInc);
    

    InstantProvider 可以在哪里

    或者,如果您在假设的时间(即没有时区等)进行操作,您可以使用 Period 类 (javadoc) 来获取 LocalDate 的两个实例之间的差异 - 例如

    // diff in days, months and years:
    Period diff = Period.between(LocalDate start, LocalDate end);
    
    // diff in days:
    Period diff = Period.daysBetween(LocalDate start, LocalDate end);
    

    但是,我不知道有任何方便的方法可以获取两个 LocalDateTimes 或 LocalTimes 之间的差异。但是...这可以使用 Period 来完成,如下所示:

    // diff between LocalDateTimes:
    public static Period between(LocalDateTime start, LocalDateTime end){
      return Period.of(
        end.getYear()-start.getYear(), 
        end.getMonthOfYear().getValue()-start.getMonthOfYear().getValue(), 
        end.getDayOfMonth()-start.getDayOfMonth(),
        end.getHourOfDay()-start.getHourOfDay(),
        end.getMinuteOfHour()-start.getMinuteOfHour(),
        end.getSecondOfMinute()-start.getSecondOfMinute(),
        end.getNanoOfSecond()-start.getNanoOfSecond()
      );
    }
    
    // diff between LocalTimes:
    public static Period between(LocalTime start, LocalTime end){
      return Period.of(0, 0, 0,
        end.getHourOfDay()-start.getHourOfDay(),
        end.getMinuteOfHour()-start.getMinuteOfHour(),
        end.getSecondOfMinute()-start.getSecondOfMinute(),
        end.getNanoOfSecond()-start.getNanoOfSecond()
      );
    }
    

    【讨论】:

    • 希望能帮助其他在将 Joda 时间与 LocalDateTime 对象一起使用时同样困惑的人:有一个类似于使用的 Period.of 方法的构造函数,除了它有一个 weeks 参数(第三,就在几个月之后)并且PeriodType 应该设置为PeriodType.yearMonthDayTime()。不幸的是,在尝试创建Duration 时它变得无效,因为月份没有标准表示,因为月份差异为 28 到 31 天。如果这是你的目标,那么你应该只转换为Date,然后减去getTime()s。
    • 继续我对 Joda 时间的评论:weeks 在上面的计算中应该设置为0,除非你碰巧知道。 amaidment 的方法有效,我的评论只是那是我想做的事情的一个限制,我想为现在使用 Joda 而不是等待 JDK8 的人提供答案。
    • @pickypg - 为了清楚起见,问题/答案与 jsr310 的使用有关(应该在 Java 8 中结束),与 jodatime 的使用无关。
    • 我知道,但这是因为搜索结果中的类名:)。这就是为什么我没有添加额外的答案
    • @pickypg - 好的,但问题标题表明它与“jsr310”有关,它被标记为 jsr310,所以它与 jodatime 无关。当我最初写问题/答案时......我什至提供了指向在 jodatime 中解决这些问题的 SO 问题的链接。
    【解决方案2】:

    回答最终JDK1.8版本。

    有两个数量类 - DurationPeriod。 Duration 是基于时间的(纳米),Period 是基于日期的(年/月/日)。

    两个相同类型的时间对象之间的时间量可以通过以下两种方式之一轻松计算(我更喜欢第一种):

    long days = ChronoUnit.DAYS.between(start, end);
    long days = start.until(end, ChronoUnit.DAYS);
    

    两个相同类型的时间对象之间的Duration可以计算如下:

    Duration d = Duration.between(start, end);
    

    两个LocalDate对象之间的Period可以计算如下:

    Period p = Period.between(start, end);
    

    【讨论】:

    • 谢谢 - 我可以请你澄清一下 Period - 当你说 Period 是“基于日期”时,这是否意味着它将不再有小时、分钟的概念, 等等。? 1.8 b75 的 Javadoc 仍然显示采用 h、m、s 等的静态构造函数。此外,between(TemporalAccessor, TemporalAccessor) 方法是否考虑了时间差异和日期差异? (澄清一下,我还在用 0.6.3)
    • 期间/持续时间有很多变化。期间现在只有年/月/日。所有之间的方法都基于本地时间或瞬间并相应地工作。
    猜你喜欢
    • 2012-02-04
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2021-01-23
    相关资源
    最近更新 更多