我想记录System.currentTimeMillis()
用户在我的程序中开始使用时的时间.当他完成后,我会减去当前System.currentTimeMillis()
从start
变量,我想向他们展示使用人类可读的格式经过诸如"XX小时XX分钟,XX秒",甚至是"XX分钟,XX秒",因为它的时间一个小时不太可能带人
最好的方法是什么?
使用java.util.concurrent.TimeUnit
课程:
String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes(millis), TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)) );
注意:TimeUnit
是Java 1.5规范的一部分,但是toMinutes
从Java 1.6开始添加.
要为值0-9添加前导零,只需执行以下操作:
String.format("%02d min, %02d sec", TimeUnit.MILLISECONDS.toMinutes(millis), TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)) );
如果TimeUnit
或toMinutes
不受支持(例如在API版本9之前的Android上),请使用以下等式:
int seconds = (int) (milliseconds / 1000) % 60 ; int minutes = (int) ((milliseconds / (1000*60)) % 60); int hours = (int) ((milliseconds / (1000*60*60)) % 24); //etc...
根据@ 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()); }
long time = 1536259; return (new SimpleDateFormat("mm:ss:SSS")).format(new Date(time));
打印:
25:36:259
嗯...一秒钟多少毫秒?一会儿?分工不是那么难.
int seconds = (int) ((milliseconds / 1000) % 60); int minutes = (int) ((milliseconds / 1000) / 60);
像这样继续几小时,几天,几周,几个月,一年,几十年,等等.
在Java 8中使用java.time包:
Instant start = Instant.now(); Thread.sleep(63553); Instant end = Instant.now(); System.out.println(Duration.between(start, end));
输出为ISO 8601持续时间格式 :( PT1M3.553S
1分钟和3.553秒).
我不会仅仅为了那个拉出额外的依赖(毕竟分裂并不那么难),但是如果你还在使用Commons Lang,那么就有了DurationFormatUtils.
手动分区,或使用SimpleDateFormat API.
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)));
由Bombe编辑:评论中显示,这种方法仅适用于较小的持续时间(即不到一天).
只是为了添加更多信息,如果你想格式化如下:HH:mm:ss
0 <= HH <=无限
0 <= mm <60
0 <= ss <60
用这个:
int h = (int) ((startTimeInMillis / 1000) / 3600); int m = (int) (((startTimeInMillis / 1000) / 60) % 60); int s = (int) ((startTimeInMillis / 1000) % 60);
我现在刚刚遇到这个问题并想出了这个问题
我认为最好的方法是:
String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toSeconds(length)/60, TimeUnit.MILLISECONDS.toSeconds(length) % 60 );
最短的解决方案:
这可能是最短的也涉及时区.
System.out.printf("%tT", millis-TimeZone.getDefault().getRawOffset());
以哪些输出为例:
00:18:32
说明:
%tT
是为24小时制格式化的时间%tH:%tM:%tS
.
%tT
也接受long作为输入,所以不需要创建Date
.printf()
将只打印以毫秒为单位指定的时间,但在当前时区中,我们必须减去当前时区的原始偏移量,使0毫秒为0小时,而不是当前时区的时间偏移值.
注意#1:如果你需要结果String
,你可以这样得到:
String t = String.format("%tT", millis-TimeZone.getDefault().getRawOffset());
注意#2:如果millis
小于一天,这只会给出正确的结果,因为输出中不包含日期部分.
使用Joda-Time:
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));
重新访问@ brent-nash贡献,我们可以使用模数函数而不是减法,并使用String.format方法作为结果字符串:
/** * 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); }
适用于API 9以下的Android
(String.format("%d hr %d min, %d sec", millis/(1000*60*60), (millis%(1000*60*60))/(1000*60), ((millis%(1000*60*60))%(1000*60))/1000))
我的简单计算:
String millisecToTime(int millisec) { int sec = millisec/1000; int second = sec % 60; int minute = sec / 60; if (minute >= 60) { int hour = minute / 60; minute %= 60; return hour + ":" + (minute < 10 ? "0" + minute : minute) + ":" + (second < 10 ? "0" + second : second); } return minute + ":" + (second < 10 ? "0" + second : second); }
快乐的编码:)