当前位置:  开发笔记 > 编程语言 > 正文

计算Java/Groovy中的已用时间

如何解决《计算Java/Groovy中的已用时间》经验,为你挑选了7个好方法。

我有...

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

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



1> 小智..:

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

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

TimeDuration td = TimeCategory.minus( stop, start )
println td


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

2> Sebastian Ce..:

您可以使用除法和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所要求的.


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

3> toolkit..:

使用标准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());



4> Fletch..:

关于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());

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



5> dhesse..:

从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";
}

哦,请避免多次退货;)



6> simao..:

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

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

Period period = new Period(startDate, endDate);
System.out.println(PeriodFormat.getDefault().print(period));

要自定义输出,请查看PeriodFormat,PeriodFormatter和PeriodFormatterBuilder类.



7> Basil Bourqu..:
TL;博士
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.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,和更多.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有