当用户在我的程序中开始执行某些操作时,我想使用System.currentTimeMillis()记录时间。 当他完成操作后,我将从start变量中减去当前的System.currentTimeMillis() ,我想使用诸如“ XX小时,XX分钟,XX秒”甚至“ XX分钟”之类的人类可读格式显示经过的时间,XX秒”,因为它不太可能花费一个小时。

最好的方法是什么?


#1楼

    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

#2楼

适用于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))

#3楼

这是一个基于Brent Nash答案的答案,希望对您有所帮助!

public static String getDurationBreakdown(long millis)
{String[] units = {" Days ", " Hours ", " Minutes ", " Seconds "};Long[] values = new Long[units.length];if(millis < 0){throw new IllegalArgumentException("Duration must be greater than zero!");}values[0] = TimeUnit.MILLISECONDS.toDays(millis);millis -= TimeUnit.DAYS.toMillis(values[0]);values[1] = TimeUnit.MILLISECONDS.toHours(millis);millis -= TimeUnit.HOURS.toMillis(values[1]);values[2] = TimeUnit.MILLISECONDS.toMinutes(millis);millis -= TimeUnit.MINUTES.toMillis(values[2]);values[3] = TimeUnit.MILLISECONDS.toSeconds(millis);StringBuilder sb = new StringBuilder(64);boolean startPrinting = false;for(int i = 0; i < units.length; i++){if( !startPrinting && values[i] != 0)startPrinting = true;if(startPrinting){sb.append(values[i]);sb.append(units[i]);}}return(sb.toString());
}

#4楼

乔达时代

使用Joda-Time :

DateTime startTime = new DateTime();// do somethingDateTime endTime = new DateTime();
Duration duration = new Duration(startTime, endTime);
Period period = duration.toPeriod().normalizedStandard(PeriodType.time());
System.out.println(PeriodFormat.getDefault().print(period));

#5楼

在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秒)。


#6楼

最短的解决方案:

这可能是最短的,也涉及时区。

System.out.printf("%tT", millis-TimeZone.getDefault().getRawOffset());

哪个输出例如:

00:18:32

说明:

%tT是24小时制的时间,格式为%tH:%tM:%tS

%tT还接受long作为输入,因此无需创建Dateprintf()将仅打印以毫秒为单位的指定时间,但是在当前时区中,因此我们必须减去当前时区的原始偏移量,以便0毫秒为0小时,而不是当前时区的时间偏移值。

注意#1:如果需要将结果作为String ,则可以这样获得:

String t = String.format("%tT", millis-TimeZone.getDefault().getRawOffset());

注意#2:仅当millis数小于一天时,这才给出正确的结果,因为输出中不包括日部分。


#7楼

如果您知道时差少于一个小时,那么可以使用以下代码:

    Calendar c1 = Calendar.getInstance();Calendar c2 = Calendar.getInstance();c2.add(Calendar.MINUTE, 51);long diff = c2.getTimeInMillis() - c1.getTimeInMillis();c2.set(Calendar.MINUTE, 0);c2.set(Calendar.HOUR, 0);c2.set(Calendar.SECOND, 0);DateFormat df = new SimpleDateFormat("mm:ss");long diff1 = c2.getTimeInMillis() + diff;System.out.println(df.format(new Date(diff1)));

其结果是:51:00


#8楼

这个答案类似于上面的一些答案。 但是,我认为这将是有益的,因为与其他答案不同,这将删除任何多余的逗号或空格并处理缩写。

/*** Converts milliseconds to "x days, x hours, x mins, x secs"* * @param millis*            The milliseconds* @param longFormat*            {@code true} to use "seconds" and "minutes" instead of "secs" and "mins"* @return A string representing how long in days/hours/minutes/seconds millis is.*/
public static String millisToString(long millis, boolean longFormat) {if (millis < 1000) {return String.format("0 %s", longFormat ? "seconds" : "secs");}String[] units = {"day", "hour", longFormat ? "minute" : "min", longFormat ? "second" : "sec"};long[] times = new long[4];times[0] = TimeUnit.DAYS.convert(millis, TimeUnit.MILLISECONDS);millis -= TimeUnit.MILLISECONDS.convert(times[0], TimeUnit.DAYS);times[1] = TimeUnit.HOURS.convert(millis, TimeUnit.MILLISECONDS);millis -= TimeUnit.MILLISECONDS.convert(times[1], TimeUnit.HOURS);times[2] = TimeUnit.MINUTES.convert(millis, TimeUnit.MILLISECONDS);millis -= TimeUnit.MILLISECONDS.convert(times[2], TimeUnit.MINUTES);times[3] = TimeUnit.SECONDS.convert(millis, TimeUnit.MILLISECONDS);StringBuilder s = new StringBuilder();for (int i = 0; i < 4; i++) {if (times[i] > 0) {s.append(String.format("%d %s%s, ", times[i], units[i], times[i] == 1 ? "" : "s"));}}return s.toString().substring(0, s.length() - 2);
}/*** Converts milliseconds to "x days, x hours, x mins, x secs"* * @param millis*            The milliseconds* @return A string representing how long in days/hours/mins/secs millis is.*/
public static String millisToString(long millis) {return millisToString(millis, false);
}

#9楼

我修改了@MyKuLLSKI的答案,并添加了对卷积的支持。 我花了几秒钟是因为我不需要它们,尽管您可以根据需要随时添加它。

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" : "");
}

#10楼

我已经在另一个答案中对此进行了介绍,但是您可以执行以下操作:

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

输出类似于Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0} ,其单位已订购。

由您决定如何根据目标语言环境对这些数据进行国际化。


#11楼

回顾@ 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);}

#12楼

我的简单计算:

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);
}

快乐的编码:)


#13楼

在Java 9中,这更容易:

    Duration elapsedTime = Duration.ofMillis(millisDiff );String humanReadableElapsedTime = String.format("%d hours, %d mins, %d seconds",elapsedTime.toHours(),elapsedTime.toMinutesPart(),elapsedTime.toSecondsPart());

这将产生一个字符串,例如0 hours, 39 mins, 9 seconds

如果要在格式化前四舍五入为秒:

    elapsedTime = elapsedTime.plusMillis(500).truncatedTo(ChronoUnit.SECONDS);

如果小时为0,则忽略以下时间:

    long hours = elapsedTime.toHours();String humanReadableElapsedTime;if (hours == 0) {humanReadableElapsedTime = String.format("%d mins, %d seconds",elapsedTime.toMinutesPart(),elapsedTime.toSecondsPart());} else {humanReadableElapsedTime = String.format("%d hours, %d mins, %d seconds",hours,elapsedTime.toMinutesPart(),elapsedTime.toSecondsPart());}

现在,我们可以有39 mins, 9 seconds

要打印以分钟开头的分钟和秒,使其始终为两位数,只需在相关的格式说明符中插入02 ,即可:

    String humanReadableElapsedTime = String.format("%d hours, %02d mins, %02d seconds",elapsedTime.toHours(),elapsedTime.toMinutesPart(),elapsedTime.toSecondsPart());

现在,我们可以有0 hours, 39 mins, 09 seconds


#14楼

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

#15楼

有一个问题。 当毫秒为59999时,实际上是1分钟,但是它将被计算为59秒,并且损失了999毫秒。

这是基于先前答案的修改版本,可以解决此问题:

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);
}

#16楼

我认为最好的方法是:

String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toSeconds(length)/60,TimeUnit.MILLISECONDS.toSeconds(length) % 60 );

#17楼

对于较少的时间(少于一个小时),我更喜欢:

long millis = ...System.out.printf("%1$TM:%1$TS", millis);
// or
String str = String.format("%1$TM:%1$TS", millis);

对于更长的间隔:

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);
}

#18楼

DurationFormatUtils.formatDurationHMS(long)


#19楼

首先, System.currentTimeMillis()Instant.now()对于计时而言并不理想。 它们都报告壁钟时间,计算机无法精确知道壁钟时间,并且壁钟时间会不规律地移动,包括例如NTP守护程序纠正系统时间时向后移动。 如果您的计时发生在一台机器上,那么您应该改用System.nanoTime() 。

其次,从Java 8开始, java.time.Duration是表示持续时间的最佳方法:

long start = System.nanoTime();
// do things...
long end = System.nanoTime();
Duration duration = Duration.ofNanos(end - start);
System.out.println(duration); // Prints "PT18M19.511627776S"
System.out.printf("%d Hours %d Minutes %d Seconds%n",duration.toHours(), duration.toMinutes() % 60, duration.getSeconds() % 60);
// prints "0 Hours 18 Minutes 19 Seconds"

#20楼

只是要添加更多信息,如果您想要格式化:HH:mm:ss

0 <= HH <=无限

0 <=毫米<60

0 <= ss <60

用这个:

int h = (int) ((startTimeInMillis / 1000) / 3600);
int m = (int) (((startTimeInMillis / 1000) / 60) % 60);
int s = (int) ((startTimeInMillis / 1000) % 60);

我现在刚遇到这个问题,并弄清楚了


#21楼

嗯...几秒钟是几毫秒? 等一下 划分并不难。

int seconds = (int) ((milliseconds / 1000) % 60);
int minutes = (int) ((milliseconds / 1000) / 60);

像这样继续几个小时,几天,几周,几个月,一年,几十年。


#22楼

手动分割,或使用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编辑 :注释中显示,此方法仅在较小的持续时间内(即少于一天)有效。


#23楼

我不会为此而引入额外的依赖关系(毕竟划分并不难),但是无论如何,如果您使用的是Commons Lang,则存在DurationFormatUtils 。

用法示例(从此处改编):

import org.apache.commons.lang3.time.DurationFormatUtilspublic String getAge(long value) {long currentTime = System.currentTimeMillis();long age = currentTime - value;String ageString = DurationFormatUtils.formatDuration(age, "d") + "d";if ("0d".equals(ageString)) {ageString = DurationFormatUtils.formatDuration(age, "H") + "h";if ("0h".equals(ageString)) {ageString = DurationFormatUtils.formatDuration(age, "m") + "m";if ("0m".equals(ageString)) {ageString = DurationFormatUtils.formatDuration(age, "s") + "s";if ("0s".equals(ageString)) {ageString = age + "ms";}}}}return ageString;
}

例:

long lastTime = System.currentTimeMillis() - 2000;
System.out.println("Elapsed time: " + getAge(lastTime)); //Output: 2s

注意 :要从两个LocalDateTime对象获取毫秒,可以使用:

long age = ChronoUnit.MILLIS.between(initTime, LocalDateTime.now())

#24楼

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

如果不支持TimeUnittoMinutes (例如在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...

#25楼

基于@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());}

#26楼

对于正确的字符串(“ 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";

#27楼

long time = 1536259;return (new SimpleDateFormat("mm:ss:SSS")).format(new Date(time));

印刷品:

25:36:259

如何在Java中将毫秒转换为“ X分钟,x秒”?相关推荐

  1. java 毫秒转分钟和秒_如何在Java中将毫秒转换为“X分钟,x秒”?

    基于@siddhadev的回答,我编写了一个函数,该函数将毫秒转换为格式化字符串:/** * Convert a millisecond duration to a string format * * ...

  2. 在 Java 中将毫秒转换为天、小时、分钟和秒

    有时我们需要将毫秒转换为天.小时.分钟或秒,因此在本文中,我们将了解如何在Java中将毫秒转换为天.小时.分钟和秒. 基本上,当您想检查执行程序所需的确切时间时,可能需要计算时间. 因此,在这种情况下 ...

  3. 如何在Java中将String转换为int?

    如何在Java中将String转换为int ? 我的字符串仅包含数字,我想返回它代表的数字. 例如,给定字符串"1234" ,结果应为数字1234 . #1楼 好吧,要考虑的一个非 ...

  4. 如何在Java中将String转换为int

    在本教程中,我们将看到将Java中的String转换为int(或Integer)的各种方法. 您可以使用以下任何一种方式: –使用Integer.parseInt(string) –使用Integer ...

  5. 如何在Java中将double转换为int?

    在本文中,我们将看到如何将double转换为int. 在Java编程中,您将有一个double原语值(例如82.14),但是要执行进一步的操作,您需要一个int值(例如82),所以让我们看看如何在Ja ...

  6. java中long如何使用_如何在Java中将long转换为int?

    问题 如何在Java中将long转换为int? #1 热门回答(218 赞) 简单类型转换应该这样做: long l = 100000; int i = (int) l; 但请注意,大数(通常大于21 ...

  7. 如何在Java中将集合转换为列表

    Lists in Java are ordered collection of data, whereas sets are an unordered collection of data. A li ...

  8. 如何在Java中将字符串转换为日期

    将Java(或任何编程语言)中的字符串转换为日期是一项基本技能,对于在项目上进行工作很有用.有时,使用字符串表示日期,然后将其转换为Date对象以供进一步使用是更容易的. 在本文中,我们将介绍许多可用 ...

  9. java yml 转 map_如何在Java中将YAML转换为JSON?

    我只想将包含yaml的字符串转换为另一个字符串,该字符串包含使用Java的corrseponding转换后的json. 例如,我有这个yaml的内容 --- paper: uuid: 8a8cbf60 ...

最新文章

  1. Excel VBA参考文献中人名与年份格式转换
  2. 档案中级职称计算机需要考几个模块,2020年职称申报需要准备哪些档案资料?这些细节必须知道!...
  3. Mysql高并发优化
  4. Kernel Method的理解
  5. 【软件工程1916|W(福州大学)_助教博客】团队第一次作业成绩公示
  6. python 多个列表_Python同时迭代多个列表
  7. python中nlp的库_用于nlp的python中的网站数据清理
  8. ESP32开发 3.bat批处理文件,批量删除编译后的build文件夹,方便Git上传分享
  9. 代码快速“检”“修”不是梦,阿里云MaxCompute Studio 2.9.0 新版本发布
  10. java 字符串 字节数组_字符串到字节数组,字节数组到Java中的字符串
  11. mybatis的javaType和ofType
  12. 【lpxt】笔者支招:九招搞定显示器黑屏
  13. 我写的万年历插件(含天干地支,农历,阳历,节气,各种节假日等),基于MooTools 1.4...
  14. 定时任务cron表达式
  15. Spring拦截器和过滤器的区别及详解
  16. 西门子PLC S7-200数字量扩展模块
  17. 约翰 霍普克罗夫特计算机科学中心,北京大学
  18. 翁恺老师 | 城堡游戏解读
  19. Linux下读取RFID卡号(C串口编程)
  20. Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs;

热门文章

  1. Qt5及模块架构分析
  2. iOS的view翻转动画实现--代码老,供参考
  3. ActiveMQ入门教程(一) - JMS和ActiveMQ简介
  4. Discuz X3.1 论坛修改的方法
  5. schema在oracle里是什么意思
  6. .NET设计模式系列文章 [原]
  7. 项目Alpha冲刺(6/10)
  8. AngularJS: 自定义指令与控制器数据交互
  9. JAVA WEB 对返回数据进行按中文名称首字母A~Z升序排序
  10. mongodb固定集合(Capped Collection)和大文件管理(GridFS)