2010-04-24 10 views
14

我熟悉的以毫秒爲單位打印時間差:在Java中打印時差的最常用的方法是?

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

但是,有一個很好的方式指定格式打印完整的時間(如:HH:MM:SS)或者使用Apache的百科全書,甚至可怕的平臺API的日期/時間對象?換句話說,編寫Java中毫秒數的時間格式最短,最簡單,毫無意義的方式是什麼?

+3

應該是'System.currentTimeMillis() - time;'。 – 2010-04-24 12:41:39

回答

20

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"); 
+0

你甚至可以把它內聯到: DurationFormatUtils.formatDuration(System.currentTimeMillis() - time,「HH:mm:ss:SS」); – Liggy 2010-04-24 12:58:05

+5

或使用幾乎相同的內置的DurationFormatUtils.formatDurationHMS(end-start); – JRL 2010-04-24 13:03:31

+0

@JRL:'DurationFormatUtils.formatDurationHMS(end-start);'將滿足問題中給出的例子,但我在我的解決方案中添加了毫秒。 – 2010-04-24 13:11:52

1

如果你真的想看到一個毫秒的差異,我不認爲有一個更短,更簡單的方法。

如果您需要更強大(但肯定不是更簡單)的方式來收集性能統計信息,則有Perf4J

1

不是我所知。但printf()可以很容易地做到這一點,如果你計算H,M和S的值,併爲每個值使用%02模式。

4

爲此目的設計的庫是更好的方法,但SimpleDateFormat用正確的TimeZone並可滿足週期不到一天的時間。更長的時間需要專門治療這一天。

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 
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)); 
+1

此輸出格式已損壞。 – 2013-11-07 18:39:59

0

TL;博士

Duration.ofMillis(…) 
     .toString() 

ISO 8601

什麼最短,最簡單的,沒有廢話的方法來WRI從毫秒導出的時間格式

ISO 8601標準定義了日期時間值的文本格式。這些格式的確很短,簡單而且沒有任何廢話。它們在很多不同的文化中都是人類可讀的,實用而且毫不含糊。

對於時間跨度不固定的時間跨度,standard formatPnYnMnDTnHnMnSP標誌着開始,並且T將年 - 月 - 日與小時 - 分鐘 - 秒分開。所以一個半小時是PT1H30M

java.time.Duration

的java.time類包括一對類來代表的時間跨度。 Duration班的課時爲幾分鐘 - 秒,而Period則爲幾個月 - 幾天。

Duration d = Duration.ofMillis(yourMillisecondsNumberGoesHere); 

java.time類默認使用ISO 8601格式來解析和生成字符串。 DurationPeriod類使用這種特定的標準格式。所以只需撥打toString即可。

String output = d.toString(); 

你可以去另一個方向,解析這些標準字符串。

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

關於java.time

java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如IntervalYearWeekYearQuartermore

相關問題