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

依然范特西╮ 提交于 2020-02-27 03:42:46

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

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

但是,这只给我留了long毫秒。 有没有更简单,更好的方法来获取时间增量?


#1楼

简单差异(无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);

以分钟为单位获取两个日期的差异。

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


可读的差异(无lib)

public static Map<TimeUnit,Long> computeDiff(Date date1, Date date2) {

    long diffInMillies = date2.getTime() - date1.getTime();

    //create the list
    List<TimeUnit> units = new ArrayList<TimeUnit>(EnumSet.allOf(TimeUnit.class));
    Collections.reverse(units);

    //create the result map of TimeUnit and difference
    Map<TimeUnit,Long> result = new LinkedHashMap<TimeUnit,Long>();
    long milliesRest = diffInMillies;

    for ( TimeUnit unit : units ) {

        //calculate difference in millisecond 
        long diff = unit.convert(milliesRest,TimeUnit.MILLISECONDS);
        long diffInMilliesForUnit = unit.toMillis(diff);
        milliesRest = milliesRest - diffInMilliesForUnit;

        //put the result in the map
        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小时

  • 计算经过的时间,注意夏令时:day + 1-day = 1 = 24h(但使用午夜时间和夏令时可能是0天和23h)

  • 计算day switches的次数,这意味着day + 1 1pm-day 11am = 1 day,即使经过的时间仅为2h(如果有夏令时,则为1h:p)

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

与JodaTime

如果您使用的是JodaTime,则可以使用以下两个日期(以Millies为后盾的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()

#2楼

尝试这个:

int epoch = (int) (new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse("01/01/1970  00:00:00").getTime() / 1000);

您可以在parse()方法参数中编辑字符串。


#3楼

不使用标准API,否。 您可以滚动自己执行以下操作:

class Duration {
    private final TimeUnit unit;
    private final long length;
    // ...
}

或者您可以使用Joda

DateTime a = ..., b = ...;
Duration d = new Duration(a, b);

#4楼

不幸的是,JDK Date API严重损坏。 我建议使用Joda时间库

Joda Time具有时间间隔的概念:

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

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

如果只关心时间比较,则大多数Date实现(包括JDK之一)都实现Comparable接口,该接口允许您使用Comparable.compareTo()


#5楼

看一下Joda Time ,它是Java的改进的Date / Time API,应该可以与Scala一起正常工作。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!