【问题标题】:Simple Java Date Calculations简单的 Java 日期计算
【发布时间】:2010-10-13 04:55:58
【问题描述】:

我想用 Java 做简单的日期计算。例如,计算到日期之间的天数差异(具有 0 时间分量)。当然,您可以做一个简单的毫秒减法,除以每天的毫秒数,这很好 - 直到夏令时进入现场。 我意识到对“天数差异”的不同解释是可能的,特别是是否应该考虑时间部分。为简单起见,假设我们有一个 0 时间分量。

这种计算似乎是一种非常普遍的需求,我很高兴能就这个问题的不同方法进行讨论。

【问题讨论】:

  • 乔达时间!!!!!! (在赶时间之前!)
  • java.time!!!!!!

标签: java date-arithmetic


【解决方案1】:

我会看看Joda 日期/时间库,尤其是ReadableInterval 类。

Joda 在 Java 中操作日期/时间时让生活变得更加轻松,我相信这是新 Java JSR 310 wrt 的基础。日期/时间。即它(或非常相似的东西)将出现在 Java 的未来版本中。

【讨论】:

【解决方案2】:

看起来 Date、Calendar 和 DateUtils 可以满足您的所有需求。 http://commons.apache.org/lang/api/org/apache/commons/lang/time/DateUtils.html

DateUtils 允许截断或舍入时间,因此您可以只处理日期。您还提到了夏令时。主要问题是当有人说他们在 DST 更改的一天 01:30 做了某事时……是哪一天 01:30?第一个还是第二个?幸运的是,这可以由 Calendar 类处理,因为它存储时区和 DST 偏移量。有关所有这些的详细信息,请查看以下内容: http://www.xmission.com/~goodhill/dates/deltaDates.html

【讨论】:

    【解决方案3】:

    更简单的选择是使用 Joda 中的 Days、Weeks、Months 和 Years 类。

    这样,你可以做一些简单的事情:

    int daysDifference = Days.daysBetween(startInstant, endInstant).getDays();
    

    【讨论】:

    • 要将现有的java.util.Date 对象转换为可以传递给daysBetweenReadableIntervals,您可以执行以下操作:new DateTime(somejavautildate)
    • 仅供参考,Joda-Time 项目现在位于maintenance mode,团队建议迁移到java.time 类。见Tutorial by Oracle
    【解决方案4】:

    使用 java.time

    现代方法是使用 java.time 类,取代麻烦的旧旧日期时间类。

    计算日期之间的天数差(时间分量为 0)

    LocalDate 类表示没有时间和时区的仅日期值。

    ChronoUnit 枚举有一些方便的方法,例如between

    在定义时间跨度时,java.time 类使用半开方法,其中开始是包含,而结束是独占

    LocalDate start = LocalDate.of( 2017 , Month.JANUARY , 23 );
    LocalDate stop = LocalDate.of( 2017 , Month.FEBRUARY , 17 );
    long daysBetween = ChronoUnit.DAYS.between( start , stop );
    

    您可以使用Period 类将该时间跨度表示为一个对象。

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

    关于java.time

    java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

    Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

    从哪里获得 java.time 类?

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

    【讨论】:

      【解决方案5】:

      Here is an article 讨论在 java 中使用日期/日历工具来计算经过的时间。

      【讨论】:

        猜你喜欢
        • 2011-04-30
        • 2011-12-01
        • 1970-01-01
        • 2011-02-13
        • 2013-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多