在Java中打印时差最习惯的方法是什么?

我熟悉以毫秒为单位的打印时间差异:

long time = System.currentTimeMillis(); //do something that takes some time... long completedIn = System.currentTimeMillis() - time; 

但是,是否有一种很好的方式,使用Apache Commons甚至可怕的平台API的Date / Time对象以指定的格式打印一个完整的时间(例如:HH:MM:SS)? 换句话说,用Java编写一个毫秒级的时间格式,最简单,毫无意义的方法是什么?

Apache Commons拥有DurationFormatUtils类,用于将指定的格式应用于持续时间。 所以,像这样的:

 long time = System.currentTimeMillis(); //do something that takes some time... long completedIn = System.currentTimeMillis() - time; DurationFormatUtils.formatDuration(completedIn, "HH:mm:ss:SS"); 

为此目的而devise的库是更好的方法,但具有正确TimeZone SimpleDateFormat可能足够less于一天的时间。 更长的时间需要特别的治疗。

 import java.text.DateFormat; import java.util.Date; import java.text.SimpleDateFormat; import java.util.TimeZone; public class Elapsed { private static final long MS_DAY = 24 * 60 * 60 * 1000; private final DateFormat df = new SimpleDateFormat("HH : mm : ss : S"); public Elapsed() { df.setTimeZone(TimeZone.getTimeZone("GMT")); } private String format(long elapsed) { long day = elapsed / MS_DAY; StringBuilder sb = new StringBuilder(); sb.append(day); sb.append(" : "); sb.append(df.format(new Date(elapsed))); return sb.toString(); } public static void main(String[] args) { Elapsed e = new Elapsed(); for (long t = 0; t < 3 * MS_DAY; t += MS_DAY / 2) { System.out.println(e.format(t)); } } } 

控制台输出:

 0:00:00:00:0
 0:12:00:00:0
 1:00:00:00:0
 1:12:00:00:0
 2:00:00:00:0
 2:12:00:00:0

如果你真的想看到一个毫秒的差异,我不认为有一个更短,更简单的方法。

如果您需要一个更强大(但肯定不是更简单)的方式来收集性能统计信息,那么就是Perf4J 。

不是我的知识。 但是如果你计算H,M和S的值,并且每个都使用%02模式,那么printf()就可以轻松地完成这个任务。

 long diff = System.currentTimeMillis() - startTime; int hours = (int)(diff / 3600000); diff -= hours * 3600000; int mins = (int)(diff / 60000); diff -= mins * 60000; int secs = (int)(diff / 1000); diff -= secs * 1000; System.out.println(String.format("%d:%d:%d.%d", hours, mins, secs, diff)); 

TL;博士

 Duration.ofMillis( … ) .toString() 

ISO 8601

什么是最短,最简单,毫无意义的方式来写一个毫秒的时间格式

ISO 8601标准定义了date时间值的文本格式。 这些格式的确很短,简单而且毫不吝啬。 它们在很多不同的文化中都是可读的,实用而且毫不含糊。

对于时间跨度不连接的时间跨度, 标准格式是PnYnMnDTnHnMnSP标志着开始, T将时间 – 月 – 日与时 – 分 – 秒分开。 所以一个半小时是PT1H30M

java.time.Duration

java.time类包含一对表示时间跨度的类。 Duration类是几分钟 – 秒,而时段是几年 – 几个月 – 天。

 Duration d = Duration.ofMillis( yourMillisecondsNumberGoesHere ); 

java.time类默认使用ISO 8601格式来parsing和生成string。 “ Duration和“ Period类使用此特定的标准格式 所以简单地调用toString

 String output = d.toString(); 

你可以去另一个方向,parsing这些标准的string。

 Duration d = Duration.parse( "PT1H30M" ); 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的遗留date时间类,如java.util.DateCalendarSimpleDateFormat

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

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是JSR 310 。

从何处获取java.time类?

  • Java SE 8SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6SE 7
    • 大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。
  • Android的
    • ThreeTenABP项目专门针对Android,采用了ThreeTen-Backport (上文提到)。
    • 请参阅如何使用ThreeTenABP …。

ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如IntervalYearWeekYearQuarter 等等 。