在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时间值的文本格式。 这些格式的确很短,简单而且毫不吝啬。 它们在很多不同的文化中都是可读的,实用而且毫不含糊。
对于时间跨度不连接的时间跨度, 标准格式是PnYnMnDTnHnMnS
。 P
标志着开始, 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.Date
, Calendar
和SimpleDateFormat
。
Joda-Time项目现在处于维护模式 ,build议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是JSR 310 。
从何处获取java.time类?
- Java SE 8和SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和SE 7
- 大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。
- Android的
- ThreeTenABP项目专门针对Android,采用了ThreeTen-Backport (上文提到)。
- 请参阅如何使用ThreeTenABP …。
ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如Interval
, YearWeek
, YearQuarter
等等 。