计算两个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日期的差异。
TimeUnit
是java.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