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

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

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

然而,这只留下了一个表示毫秒的。有没有更简单、更好的方法来获取时间增量

简单差异(无库)

/**
*在两次约会之间取得差异
*@param date1最早的日期
*@param date2最新日期
*@param timeUnit您想要差异的单位
*@以提供的单位返回差异值
*/
公共静态长getDateDiff(日期日期1、日期日期2、时间单位时间单位){
long diffinmilies=date2.getTime()-date1.getTime();
返回timeUnit.convert(diffinmilies,timeUnit.ms);
}

然后你能打电话给:

getDateDiff(日期1,日期2,时间单位:分钟);

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

TimeUnitjava.util.concurrent.TimeUnit,一个标准的java枚举,从纳秒到天


人类可读差异(无库)

公共静态地图<时间单位,长>计算IFF(日期1,日期2){
long diffinmilies=date2.getTime()-date1.getTime();
//创建列表
List<TimeUnit>units=newarraylist<TimeUnit>(EnumSet.allOf(TimeUnit.class));
收藏。反向(单位);
//创建时间单位和差异的结果图
Map<TimeUnit,Long>result=newlinkedhashmap<TimeUnit,Long>();
长毫秒测试=差值毫秒;
用于(时间单位:单位){
//以毫秒为单位计算差值
long diff=单位转换(毫秒测试,时间单位毫秒);
长差分毫秒FORUNIT=单位为托米利(差分);
milliesRest=milliesRest-单位的差值毫秒;
//把结果放在地图上
结果。放置(单位,差异);
}
返回结果;
}

http://ideone.com/5dXeu6

输出类似于Map:{DAYS=1,HOURS=3,MINUTES=46,SECONDS=40,毫秒=0,微秒=0,纳秒=0},单位按顺序排列

您只需将该映射转换为用户友好的字符串


警告

上面的代码片段计算了两个实例之间的简单差异。在夏令时切换期间,它可能会导致问题,如这篇文章。这意味着,如果计算日期之间的差异而没有时间,则可能会缺少一天/小时

在我看来,日期差异有点主观,尤其是在白天。你可以:

  • 计算24小时运行时间:天+1-天=1天=24小时

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

  • 计算日间开关的数量,这意味着白天+1下午1点-第11上午11点=1天,即使经过的时间仅为2小时(如果有夏时制,则为1小时:p)

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

与乔达蒂姆

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

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

但您也可以获得当地日期/时间的差异:

//返回4,因为闰年是366天
新期间(LocalDate.now(),LocalDate.now().plusDays(365*5),PeriodType.years()).getYears()
//这次它返回5
新期间(LocalDate.now(),LocalDate.now().plusDays(365*5+1),PeriodType.years()).getYears()
//您也可以使用这些静态方法
Years.Years介于(LocalDate.now(),LocalDate.now().plusDays(365*5)).getYears()之间

发表评论