计算Java/Groovy中的已用时间

ope*_*sas 39 java groovy date

我有...


Date start = new Date()

...
...
...

Date stop = new Date()
Run Code Online (Sandbox Code Playgroud)

我想得到这两个日期之间的年,月,日,小时,分钟和秒.

-

我会改进这个问题.

我只是想把经过的时间作为一个绝对的衡量标准,不考虑闰年,每个月的日子等.

因此,我认为过去几年和几个月都是不可能的,我能得到的只是天,小时,分钟和秒.

更具体地说,我想告诉某个任务持续了例如

20 sec
13 min, 4 sec
2 h, 10 min, 2 sec
4 d, 4 h, 2 min, 2 sec
Run Code Online (Sandbox Code Playgroud)

所以请原谅我缺乏精确性.

小智 96

我刚刚发现了这个快速的Groovy源解决方案:

import groovy.time.TimeCategory 
import groovy.time.TimeDuration

TimeDuration td = TimeCategory.minus( stop, start )
println td
Run Code Online (Sandbox Code Playgroud)

  • 你不喜欢groovy吗?不需要一页代码就可以做一些简单的事情 (7认同)
  • @Booyeoo:或者更具体地说:`import groovy.time.TimeCategory import groovy.time.TimeDuration` @Patrick:只要你问:是的,我喜欢Groovy. (5认同)
  • import groovy.time.* (4认同)
  • javadoc:http://groovy.codehaus.org/api/groovy/time/TimeCategory.html#minus%28java.util.Date,%20java.util.Date%29 (2认同)

Seb*_*lis 25

您可以使用除法和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;
Run Code Online (Sandbox Code Playgroud)

这应该会为您提供所需的所有信息.

编辑:由于人们似乎感到困惑,不,这不会把闰年或夏令时转换考虑在内.这是纯粹的经过时间,这是opensas所要求的.

  • 闰年并非如此简单.你应该至少提出一个警告,以免误导人. (3认同)
  • +1解决方案可以解决我认为是人们现实世界中很大一部分问题的解决方案 (3认同)

too*_*kit 19

使用标准Date API并不那么容易.

您可能想要查看Joda TimeJSR-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());
Run Code Online (Sandbox Code Playgroud)


Fle*_*tch 10

关于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());
Run Code Online (Sandbox Code Playgroud)

(不确定这是否有助于原始问题,但肯定是搜索者).


dhe*_*sse 6

从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";
}
Run Code Online (Sandbox Code Playgroud)

哦,请避免多次退货;)


sim*_*mao 6

实际上,关于Joda-Time的上述答案.

使用Joda-Time的Period类有一种更简单的方法:

Period period = new Period(startDate, endDate);
System.out.println(PeriodFormat.getDefault().print(period));
Run Code Online (Sandbox Code Playgroud)

要自定义输出,请查看PeriodFormat,PeriodFormatterPeriodFormatterBuilder类.


Bas*_*que 6

TL;博士

Duration.between( then , Instant.now() )
Run Code Online (Sandbox Code Playgroud)

使用java.time

现代方法使用java.time类来取代麻烦的旧日期时间类.

而不是Date,使用Instant.该Instant级表示时间轴上的时刻UTC,分辨率为纳秒(最多9个(9)小数的位数).

Instant then = Instant.now();
…
Instant now = Instant.now();
Run Code Online (Sandbox Code Playgroud)

将该Duration类用于未附加到时间线的时间跨度,分辨率为day-hours-minutes-seconds-nanos.

Duration d = Duration.between( then , now );
Run Code Online (Sandbox Code Playgroud)

在一段时间内,解决了几年 - 几天的日期,请使用该Period课程.

生成字符串是标准ISO 8601格式的持续时间:PnYnMnDTnHnMnS.该P标志的开始.将T小时 - 分钟 - 秒的任何年 - 月 - 天分开.那么两个半小时PT2H30M.

String output = d.toString();
Run Code Online (Sandbox Code Playgroud)

在Java 9和更高版本,可以使用方法来访问各个部分toDaysPart,toHoursPart等.


关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如Instant.now,Instant,和java.util.Date.

现在处于维护模式Joda-Time项目建议迁移到java.time类.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Calendar,SimpleDateFormat,Interval,和更多.