计算两个 Java 日期实例之间的差异简单差异(无 lib)人类可读的差异(无lib)警告与JodaTime
我在Scala中使用Java的类,并希望比较对象和当前时间。我知道我可以使用getTime()计算增量:java.util.Date
Date
(new java.util.Date()).getTime() - oldDate.getTime()
但是,这只会给我留下一个代表毫秒。有没有更简单,更好的方法来获得时间增量?long
我在Scala中使用Java的类,并希望比较对象和当前时间。我知道我可以使用getTime()计算增量:java.util.Date
Date
(new java.util.Date()).getTime() - oldDate.getTime()
但是,这只会给我留下一个代表毫秒。有没有更简单,更好的方法来获得时间增量?long
/**
* 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 个日期的差异。
TimeUnit
是,一个从纳米到天的标准Java枚举。java.util.concurrent.TimeUnit
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;
}
输出类似于 ,单位有序。Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0}
您只需要将该映射转换为用户友好的字符串即可。
上面的代码片段计算 2 个时刻之间的简单差异。它可能会在夏令时开关期间导致问题,如本文中所述。这意味着,如果您计算没有时间的日期之间的差异,则可能会缺少一天/小时。
在我看来,日期差异有点主观,特别是在日子里。您可以:
计算经过的 24 小时数:天 +1 - 天 = 1 天 = 24 小时
计算经过的时间数,注意夏令时:天+1 - 天 = 1 = 24h(但使用午夜时间和夏令时,它可能是0天和23h)
计算的数量,这意味着第一天+ 1下午1点 - 第11天上午= 1天,即使经过的时间只有2小时(如果有夏令时:p,则为1小时)day switches
我的答案是有效的,如果你的日期差异在天的定义与第一种情况相匹配
如果您使用的是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()
不幸的是,JDK API被严重破坏了。我建议使用Joda Time图书馆。Date
Joda Time有一个时间间隔的概念:
Interval interval = new Interval(oldTime, new Instant());
编辑:顺便说一句,Joda有两个概念:表示两个时间时刻之间的时间间隔(表示上午8点到10点之间的时间),以及表示没有实际时间边界的时间长度(例如,表示两个小时!Interval
Duration
如果你只关心时间比较,大多数实现(包括JDK)都实现了允许你使用Compable.compareTo()
的接口。Date
Comparable