我熟悉以毫秒为单位的打印时差:
long time = System.currentTimeMillis();
//do something that takes some time...
long completedIn = System.currentTimeMillis() - time;
但是,使用Apache Commons甚至是可怕的平台API的日期/时间对象,是否有一种很好的方式以指定的格式打印完整的时间(例如:HH:MM:SS)?换句话说,在Java中编写从毫秒派生的时间格式的最短,最简单,没有废话的方法是什么?
答案 0 :(得分:21)
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");
答案 1 :(得分:5)
答案 2 :(得分:2)
Duration.ofMillis( … )
.toString()
...或...
Duration.between( // `Duration` represents a span of time unattached to the timeline, in a scale of days-hours-minutes-seconds-nanos.
instantEarlier , // Capture the current moment to start.
Instant.now() // Capture the current moment now, in UTC.
) // Returns a `Duration` object.
.toString() // Generate a string in standard ISO 8601 format.
PT1M23.407S
什么是编写从毫秒派生的时间格式的最短,最简单,没有废话的方法
ISO 8601标准定义了日期时间值的文本格式。这些格式确实简短,简单,毫无废话。它们在各种文化中基本上是人类可读的,实用且明确。
对于未附加到时间轴的时间跨度,standard format为PnYnMnDTnHnMnS
。 P
标记开头,T
将年 - 月 - 日与小时 - 分 - 秒分开。所以一个半小时是PT1H30M
。
java.time.Duration
java.time类包含一对表示时间跨度的类。 Duration
课程为小时 - 分钟 - 秒,Period
。
Instant
Instant
类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。
Instant earlier = Instant.now() ; // Capture the current moment in UTC.
…
Instant later = Instant.now() ;
Duration d = Duration.between( earlier , later ) ;
String output = d.toString() ;
PT3.52S
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 3 :(得分:1)
如果你真的想看到毫秒的差异,我认为没有更简短的方法。
如果您需要更强大(但肯定不是更简单)的方式来收集效果统计信息,则有Perf4J。
答案 4 :(得分:1)
据我所知。但是,如果你计算H,M和S的值,printf()可以很容易地做到这一点,并且每个都使用%02模式。
答案 5 :(得分:0)
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));