我有...
Date start = new Date() ... ... ... Date stop = new Date()
我想得到这两个日期之间的年,月,日,小时,分钟和秒.
-
我会改进这个问题.
我只是想把经过的时间作为一个绝对的衡量标准,不考虑闰年,每个月的日子等.
因此,我认为过去几年和几个月都是不可能的,我能得到的只是天,小时,分钟和秒.
更具体地说,我想告诉某个任务持续了例如
20 sec 13 min, 4 sec 2 h, 10 min, 2 sec 4 d, 4 h, 2 min, 2 sec
所以请原谅我缺乏精确性.
我刚刚发现了这个快速的Groovy源解决方案:
import groovy.time.TimeCategory import groovy.time.TimeDuration TimeDuration td = TimeCategory.minus( stop, start ) println td
您可以使用除法和mod完成所有这些操作.
long l1 = start.getTime(); long l2 = stop.getTime(); long diff = l2 - l1; long secondInMillis = 1000; long minuteInMillis = secondInMillis * 60; long hourInMillis = minuteInMillis * 60; long dayInMillis = hourInMillis * 24; long elapsedDays = diff / dayInMillis; diff = diff % dayInMillis; long elapsedHours = diff / hourInMillis; diff = diff % hourInMillis; long elapsedMinutes = diff / minuteInMillis; diff = diff % minuteInMillis; long elapsedSeconds = diff / secondInMillis;
这应该会为您提供所需的所有信息.
编辑:由于人们似乎感到困惑,不,这不会把闰年或夏令时转换考虑在内.这是纯粹的经过时间,这是opensas所要求的.
使用标准Date API并不那么容易.
您可能想要查看Joda Time或JSR-310.
我不是Joda的专家,但我认为代码是:
Interval interval = new Interval(d1.getTime(), d2.getTime()); Period period = interval.toPeriod(); System.out.printf( "%d years, %d months, %d days, %d hours, %d minutes, %d seconds%n", period.getYears(), period.getMonths(), period.getDays(), period.getHours(), period.getMinutes(), period.getSeconds());
关于JodaTime,我刚刚开始; 感谢响应者的建议.这是一个更简洁的Joda代码版本:
Period period = new Period(d1.getTime(), d2.getTime()); System.out.printf( "%d years, %d months, %d days, %d hours, %d minutes, %d seconds%n", period.getYears(), period.getMonths(), period.getDays(), period.getHours(), period.getMinutes(), period.getSeconds());
(不确定这是否有助于原始问题,但肯定是搜索者).
从Java 1.5开始,你应该使用TimeUnit.
这是一个简单明了的例子.我认为在groovy中它可能变得更短(一如既往).
/** * Formats a given {@link Date} to display a since-then timespan. * @param created * @return String with a format like "3 minutes ago" */ public static String getElapsedTime(Date created) { long duration = System.currentTimeMillis() - created.getTime(); long seconds = TimeUnit.MILLISECONDS.toSeconds(duration); long days = TimeUnit.MILLISECONDS.toDays(duration); long hours = TimeUnit.MILLISECONDS.toHours(duration); long minutes = TimeUnit.MILLISECONDS.toMinutes(duration); if (days > 0) { return days + " days"; } if (hours > 0) { return hours + " hrs"; } if (minutes > 0) { return minutes + " minutes"; } return seconds + " seconds"; }
哦,请避免多次退货;)
实际上,关于Joda-Time的上述答案.
使用Joda-Time的Period类有一种更简单的方法:
Period period = new Period(startDate, endDate); System.out.println(PeriodFormat.getDefault().print(period));
要自定义输出,请查看PeriodFormat,PeriodFormatter和PeriodFormatterBuilder类.
Duration.between( then , Instant.now() )使用java.time
现代方法使用java.time类来取代麻烦的旧日期时间类.
而不是Date
,使用Instant
.该Instant
级表示时间轴上的时刻UTC,分辨率为纳秒(最多9个(9)小数的位数).
Instant then = Instant.now(); … Instant now = Instant.now();
将该Duration
类用于未附加到时间线的时间跨度,分辨率为day-hours-minutes-seconds-nanos.
Duration d = Duration.between( then , now );
在一段时间内,解决了几年 - 几天的日期,请使用该Period
课程.
生成字符串是标准ISO 8601格式的持续时间:PnYnMnDTnHnMnS
.该P
标志的开始.将T
小时 - 分钟 - 秒的任何年 - 月 - 天分开.那么两个半小时PT2H30M
.
String output = d.toString();
在Java 9和更高版本,可以使用方法来访问各个部分toDaysPart
,toHoursPart
等.
该java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如Instant.now
,Instant
,和java.util.Date
.
现在处于维护模式的Joda-Time项目建议迁移到java.time类.
要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.
从哪里获取java.time类?
Java SE 8和 SE 9及更高版本
内置.
带有捆绑实现的标准Java API的一部分.
Java 9增加了一些小功能和修复.
Java SE 6和 SE 7
许多java.time功能都被反向移植到ThreeTen-Backport中的 Java 6和7 .
Android的
所述ThreeTenABP项目适应ThreeTen-反向移植为Android(上面提到的)特异性.
请参阅如何使用ThreeTenABP ....
该ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Calendar
,SimpleDateFormat
,Interval
,和更多.