最常用的方法是在Java中打印时差吗?

时间:2010-04-24 12:39:42

标签: java datetime idioms code-formatting

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

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

但是,使用Apache Commons甚至是可怕的平台API的日期/时间对象,是否有一种很好的方式以指定的格式打印完整的时间(例如:HH:MM:SS)?换句话说,在Java中编写从毫秒派生的时间格式的最短,最简单,没有废话的方法是什么?

6 个答案:

答案 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)

TL;博士

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

  

什么是编写从毫秒派生的时间格式的最短,最简单,没有废话的方法

ISO 8601标准定义了日期时间值的文本格式。这些格式确实简短,简单,毫无废话。它们在各种文化中基本上是人类可读的,实用且明确。

对于未附加到时间轴的时间跨度,standard formatPnYnMnDTnHnMnSP标记开头,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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance 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的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 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));