DateTime startTime = new DateTime();
// do something
DateTime endTime = new DateTime();
Duration duration = new Duration(startTime, endTime);
Period period = duration.toPeriod().normalizedStandard(PeriodType.time());
System.out.println(PeriodFormat.getDefault().print(period));
1
嗯...一秒钟多少毫秒?一会儿?分工不是那么难 .
int seconds = (int) ((milliseconds / 1000) % 60);
int minutes = (int) ((milliseconds / 1000) / 60);
/**
* Convert a millisecond duration to a string format
*
* @param millis A duration to convert to a string form
* @return A string of the form "X Days Y Hours Z Minutes A Seconds B Milliseconds".
*/
public static String getDurationBreakdown(long millis) {
if (millis < 0) {
throw new IllegalArgumentException("Duration must be greater than zero!");
}
long days = TimeUnit.MILLISECONDS.toDays(millis);
long hours = TimeUnit.MILLISECONDS.toHours(millis) % 24;
long minutes = TimeUnit.MILLISECONDS.toMinutes(millis) % 60;
long seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % 60;
long milliseconds = millis % 1000;
return String.format("%d Days %d Hours %d Minutes %d Seconds %d Milliseconds",
days, hours, minutes, seconds, milliseconds);
}
int h = (int) ((startTimeInMillis / 1000) / 3600);
int m = (int) (((startTimeInMillis / 1000) / 60) % 60);
int s = (int) ((startTimeInMillis / 1000) % 60);
long start = System.currentTimeMillis();
// do your work...
long elapsed = System.currentTimeMillis() - start;
DateFormat df = new SimpleDateFormat("HH 'hours', mm 'mins,' ss 'seconds'");
df.setTimeZone(TimeZone.getTimeZone("GMT+0"));
System.out.println(df.format(new Date(elapsed)));
long startTime = System.currentTimeMillis();
// do your work...
long endTime=System.currentTimeMillis();
long diff=endTime-startTime;
long hours=TimeUnit.MILLISECONDS.toHours(diff);
diff=diff-(hours*60*60*1000);
long min=TimeUnit.MILLISECONDS.toMinutes(diff);
diff=diff-(min*60*1000);
long seconds=TimeUnit.MILLISECONDS.toSeconds(diff);
//hour, min and seconds variables contains the time elapsed on your work
20
long time = 1536259;
return (new SimpleDateFormat("mm:ss:SSS")).format(new Date(time));
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;
}
public static String formatTime(long millis) {
long seconds = Math.round((double) millis / 1000);
long hours = TimeUnit.SECONDS.toHours(seconds);
if (hours > 0)
seconds -= TimeUnit.HOURS.toSeconds(hours);
long minutes = seconds > 0 ? TimeUnit.SECONDS.toMinutes(seconds) : 0;
if (minutes > 0)
seconds -= TimeUnit.MINUTES.toSeconds(minutes);
return hours > 0 ? String.format("%02d:%02d:%02d", hours, minutes, seconds) : String.format("%02d:%02d", minutes, seconds);
}
6
根据@ siddhadev的回答,我编写了一个将毫秒转换为格式化字符串的函数:
/**
* Convert a millisecond duration to a string format
*
* @param millis A duration to convert to a string form
* @return A string of the form "X Days Y Hours Z Minutes A Seconds".
*/
public static String getDurationBreakdown(long millis) {
if(millis < 0) {
throw new IllegalArgumentException("Duration must be greater than zero!");
}
long days = TimeUnit.MILLISECONDS.toDays(millis);
millis -= TimeUnit.DAYS.toMillis(days);
long hours = TimeUnit.MILLISECONDS.toHours(millis);
millis -= TimeUnit.HOURS.toMillis(hours);
long minutes = TimeUnit.MILLISECONDS.toMinutes(millis);
millis -= TimeUnit.MINUTES.toMillis(minutes);
long seconds = TimeUnit.MILLISECONDS.toSeconds(millis);
StringBuilder sb = new StringBuilder(64);
sb.append(days);
sb.append(" Days ");
sb.append(hours);
sb.append(" Hours ");
sb.append(minutes);
sb.append(" Minutes ");
sb.append(seconds);
sb.append(" Seconds");
return(sb.toString());
}
public static String intervalToHumanReadableTime(int intervalMins) {
if(intervalMins <= 0) {
return "0";
} else {
long intervalMs = intervalMins * 60 * 1000;
long days = TimeUnit.MILLISECONDS.toDays(intervalMs);
intervalMs -= TimeUnit.DAYS.toMillis(days);
long hours = TimeUnit.MILLISECONDS.toHours(intervalMs);
intervalMs -= TimeUnit.HOURS.toMillis(hours);
long minutes = TimeUnit.MILLISECONDS.toMinutes(intervalMs);
StringBuilder sb = new StringBuilder(12);
if (days >= 1) {
sb.append(days).append(" day").append(pluralize(days)).append(", ");
}
if (hours >= 1) {
sb.append(hours).append(" hour").append(pluralize(hours)).append(", ");
}
if (minutes >= 1) {
sb.append(minutes).append(" minute").append(pluralize(minutes));
} else {
sb.delete(sb.length()-2, sb.length()-1);
}
return(sb.toString());
}
}
public static String pluralize(long val) {
return (Math.round(val) > 1 ? "s" : "");
}
6
对于不到一小时的小时间,我更喜欢:
long millis = ...
System.out.printf("%1$TM:%1$TS", millis);
// or
String str = String.format("%1$TM:%1$TS", millis);
更长的intervalls:
private static final long HOUR = TimeUnit.HOURS.toMillis(1);
...
if (millis < HOUR) {
System.out.printf("%1$TM:%1$TS%n", millis);
} else {
System.out.printf("%d:%2$TM:%2$TS%n", millis / HOUR, millis % HOUR);
}
3
使用java.util.concurrent.TimeUnit,并使用这个简单的方法:
private static long timeDiff(Date date, Date date2, TimeUnit unit) {
long milliDiff=date2.getTime()-date.getTime();
long unitDiff = unit.convert(milliDiff, TimeUnit.MILLISECONDS);
return unitDiff;
}
例如:
SimpleDateFormat sdf = new SimpleDateFormat("yy/MM/dd HH:mm:ss");
Date firstDate = sdf.parse("06/24/2017 04:30:00");
Date secondDate = sdf.parse("07/24/2017 05:00:15");
Date thirdDate = sdf.parse("06/24/2017 06:00:15");
System.out.println("days difference: "+timeDiff(firstDate,secondDate,TimeUnit.DAYS));
System.out.println("hours difference: "+timeDiff(firstDate,thirdDate,TimeUnit.HOURS));
System.out.println("minutes difference: "+timeDiff(firstDate,thirdDate,TimeUnit.MINUTES));
System.out.println("seconds difference: "+timeDiff(firstDate,thirdDate,TimeUnit.SECONDS));
3
对于正确的字符串(“1小时,3秒”,“3分钟”但不是“0小时,0分钟,3秒”)我写这段代码:
int seconds = (int)(millis / 1000) % 60 ;
int minutes = (int)((millis / (1000*60)) % 60);
int hours = (int)((millis / (1000*60*60)) % 24);
int days = (int)((millis / (1000*60*60*24)) % 365);
int years = (int)(millis / 1000*60*60*24*365);
ArrayList<String> timeArray = new ArrayList<String>();
if(years > 0)
timeArray.add(String.valueOf(years) + "y");
if(days > 0)
timeArray.add(String.valueOf(days) + "d");
if(hours>0)
timeArray.add(String.valueOf(hours) + "h");
if(minutes>0)
timeArray.add(String.valueOf(minutes) + "min");
if(seconds>0)
timeArray.add(String.valueOf(seconds) + "sec");
String time = "";
for (int i = 0; i < timeArray.size(); i++)
{
time = time + timeArray.get(i);
if (i != timeArray.size() - 1)
time = time + ", ";
}
if (time == "")
time = "0 sec";
25 回答
这是基于布伦特纳什答案的答案,希望有所帮助!
Joda-Time
使用Joda-Time:
嗯...一秒钟多少毫秒?一会儿?分工不是那么难 .
像这样继续几小时,几天,几周,几个月,一年,几十年,等等 .
重新访问@ brent-nash贡献,我们可以使用模数函数而不是减法,并使用String.format方法作为结果字符串:
适用于API 9以下的Android
使用java.util.concurrent.TimeUnit类:
注意:
TimeUnit
是Java 1.5规范的一部分,但是从Java 1.6开始添加了toMinutes
.要为值0-9添加前导零,只需执行以下操作:
如果不支持
TimeUnit
或toMinutes
(例如在API版本9之前的Android上),请使用以下等式:我不会仅仅为了那个拉出额外的依赖(毕竟分裂并不那么难),但是如果你还在使用Commons Lang,那么就有DurationFormatUtils .
如果您知道时差不到一小时,那么您可以使用以下代码:
结果将是:51:00
只是为了添加更多信息,如果你想格式化如下:HH:mm:ss
0 <= HH <=无穷大
0 <= mm <60
0 <= ss <60
用这个:
我现在才遇到这个问题,并想出了这个问题
手划分,或使用SimpleDateFormat API .
Edit by Bombe :评论中显示,这种方法仅适用于较小的持续时间(即不到一天) .
这在Java 9中更容易:
这会产生类似
0 hours, 39 mins, 9 seconds
的字符串 .如果要在格式化之前舍入到整秒:
如果它们是0,则省略小时:
现在我们可以举例如
39 mins, 9 seconds
.要使用前导零打印分钟和秒以使它们始终为两位数,只需将
02
插入相关的格式说明符中,即:现在我们可以举例如
0 hours, 39 mins, 09 seconds
.Shortest solution:
这可能是最短的也涉及时区 .
以哪些输出为例:
Explanation:
%tT
是将24小时制格式化为%tH:%tM:%tS
的时间 .%tT
也接受long作为输入,因此无需创建Date
.printf()
将只打印以毫秒为单位指定的时间,但在当前时区中,我们必须减去当前时区的原始偏移量,使0毫秒为0小时,而不是当前时区的时间偏移值 .Note #1: 如果您需要将结果作为
String
,您可以这样得到:Note #2: 如果
millis
小于一天,则仅提供正确的结果,因为日期部分未包含在输出中 .我认为最好的方法是:
打印:
在Java 8中使用java.time package:
输出位于ISO 8601 Duration format:
PT1M3.553S
(1分3.553秒) .这个答案类似于上面的一些答案 . 但是,我认为这将是有益的,因为与其他答案不同,这将删除任何额外的逗号或空格并处理缩写 .
我的简单计算:
快乐编码:)
我已在另一个answer中介绍了这一点,但您可以这样做:
输出类似于
Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0}
,单位已订购 .由您决定如何根据目标语言环境来国际化此数据 .
这儿存在一个问题 . 当毫秒为59999时,实际上它是1分钟,但它将被计算为59秒并且丢失999毫秒 .
以下是基于之前答案的修改版本,可以解决此问题:
根据@ siddhadev的回答,我编写了一个将毫秒转换为格式化字符串的函数:
我修改了@MyKuLLSKI的答案并添加了plurlization支持 . 我花了几秒钟,因为我不需要它们,但如果你需要,可以随意重新添加它 .
对于不到一小时的小时间,我更喜欢:
更长的intervalls:
使用java.util.concurrent.TimeUnit,并使用这个简单的方法:
例如:
对于正确的字符串(“1小时,3秒”,“3分钟”但不是“0小时,0分钟,3秒”)我写这段代码: