计算两个Java日期实例之间的差异

我在Scala中使用Java的java.util.Date类,想要比较Date对象和当前时间。 我知道我可以使用getTime()来计算增量:

(new java.util.Date()).getTime() - oldDate.getTime()

但是,这只会让我有很long代表毫秒。 有没有更简单,更好的方法来获得时间增量?


不幸的是,JDK Date API非常糟糕。 我建议使用乔达时间库。

乔达时间有一个时间的概念间隔:

Interval interval = new Interval(oldTime, new Instant());

编辑:顺便说,约达有两个概念: Interval用于表示两个时刻(表示上午8点和上午10点之间的时间)之间的时间间隔,和一个Duration表示的时间,而不实际时间边界的长度(例如代表2小时!)

如果你只关心时间比较,大多数Date实现(包括JDK)实现Comparable接口,它允许你使用Comparable.compareTo()


简单差异(无lib)

/**
 * Get a diff between two dates
 * @param date1 the oldest date
 * @param date2 the newest date
 * @param timeUnit the unit in which you want the diff
 * @return the diff value, in the provided unit
 */
public static long getDateDiff(Date date1, Date date2, TimeUnit timeUnit) {
    long diffInMillies = date2.getTime() - date1.getTime();
    return timeUnit.convert(diffInMillies,TimeUnit.MILLISECONDS);
}

然后你可以打电话给:

getDateDiff(date1,date2,TimeUnit.MINUTES);

以分钟为单位获得2日期的差异。

TimeUnitjava.util.concurrent.TimeUnit ,这是一个标准的Java枚举,从纳米到数天。


人类可读的差异(无lib)

public static Map<TimeUnit,Long> computeDiff(Date date1, Date date2) {
    long diffInMillies = date2.getTime() - date1.getTime();
    List<TimeUnit> units = new ArrayList<TimeUnit>(EnumSet.allOf(TimeUnit.class));
    Collections.reverse(units);
    Map<TimeUnit,Long> result = new LinkedHashMap<TimeUnit,Long>();
    long milliesRest = diffInMillies;
    for ( TimeUnit unit : units ) {
        long diff = unit.convert(milliesRest,TimeUnit.MILLISECONDS);
        long diffInMilliesForUnit = unit.toMillis(diff);
        milliesRest = milliesRest - diffInMilliesForUnit;
        result.put(unit,diff);
    }
    return result;
}

http://ideone.com/5dXeu6

输出结果如图所示Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0}

您只需将该地图转换为用户友好的字符串即可。


警告

上面的代码片段计算了两个瞬间之间的简单差异。 这可能会导致在夏令时切换过程中出现问题,如本文中所述。 这意味着如果您计算日期之间的差异而没有时间,则可能缺少日/小时。

在我看来,日期差异是一种主观的,尤其是在几天内。 你可以:

  • 统计24小时经过时间的数量:天+ 1天= 1天= 24小时

  • 计算经过时间的数量,照顾夏令时:天+ 1天= 1 = 24小时(但使用午夜时间和夏令时可以是0天和23小时)

  • 计算day switches的数量,这意味着即使经过的时间仅为2小时(或者如果存在夏令时:p,则为1天),即日期+ 1 1pm - 上午11am = 1天,

  • 如果您的日期差异定义与第一种情况相符,我的回答是有效的

    随着JodaTime

    如果您使用的是JodaTime,您可以得到2个瞬间(毫秒支持的ReadableInstant)日期的差异:

    Interval interval = new Interval(oldInstant, new Instant());
    

    但是您也可以获取本地日期/时间的差异:

    // returns 4 because of the leap year of 366 days
    new Period(LocalDate.now(), LocalDate.now().plusDays(365*5), PeriodType.years()).getYears() 
    
    // this time it returns 5
    new Period(LocalDate.now(), LocalDate.now().plusDays(365*5+1), PeriodType.years()).getYears() 
    
    // And you can also use these static methods
    Years.yearsBetween(LocalDate.now(), LocalDate.now().plusDays(365*5)).getYears()
    

    int diffInDays = (int)( (newerDate.getTime() - olderDate.getTime()) 
                     / (1000 * 60 * 60 * 24) )
    

    请注意,这适用于UTC日期,所以如果您查看当地日期,则差异可能是休息一天。 由于夏令时间的原因,使用本地日期正确工作需要采用完全不同的方法。

    链接地址: http://www.djcxy.com/p/36699.html

    上一篇: Calculating the difference between two Java date instances

    下一篇: JavaScript setDate returning wrong dates