2012-01-08 81 views
2

我試圖顯示一個時間差異到一個字符串後面的形式00:00:00(小時:分鐘:秒),零填充。我有以下代碼:DateFormat中的零填充小時

long timeDiff = System.currentTimeMillis() - mStartRecordingTime; 
time = DateFormat.format("hh:mm:ss", timeDiff).toString(); 

我在測試它時,timeDiff測量是不超過幾秒鐘,但小時不顯示爲00.我在順便JST時區。

+0

實際的問題是小時顯示爲09而不是00. – pilcrowpipe 2012-01-08 02:19:07

+0

而不是顯示經過時間作爲時間(模糊和混亂),使用標準的[ISO 8601持續時間](https:// en .wikipedia.org/wiki/ISO_8601#持續時間)'PnYnMnDTnHnMnS'格式,例如'PT4S'四秒鐘。 – 2017-01-16 00:18:00

回答

2

你從哪裏得到mStartRecordingTime?它看起來並不像我在同一個語言環境中用System.currentTimeMillis()設置的那樣;如果是的話,那麼時差就會反映出實際的差異,並且這將起作用。看起來,記錄時間以某種方式與UTC相距約9小時。

另一張海報是正確的,用這個值產生的日期將是接近時代,但如果你只是想獲得小時,分鐘和秒,那麼你應該是沒問題的。請記住,你正在處理已用時間,而不是時鐘/日曆時間,所以我不希望日期格式(而不是時間格式)能夠爲你工作。

+0

我用另一個類來設置它: mRecorder.mStartRecordingTime = System.currentTimeMillis(); – pilcrowpipe 2012-01-08 05:11:17

2

使用SimpleDateFormat

long timeDiff = System.currentTimeMillis() - mStartRecordingTime; 
String time = new SimpleDateFormat("hh:mm:ss").format(new Date(timeDiff)); 
+1

小心那裏,timeDiff只會是幾秒鐘,所以新的日期(timeDiff)會在1970年給你一個日期 – Sean 2012-01-08 02:28:37

0

您需要補償的時區。用你所擁有的,將日期格式化器改爲使用UTC作爲時區可能是最簡單的。下面是一些代碼,應該有所幫助:

long timeDiff = System.currentTimeMillis() - mStartRecordingTime; 
    DateFormat df = new SimpleDateFormat("HH:mm:ss"); 
    df.setTimeZone(TimeZone.getTimeZone("UTC")); 
    String time = df.format(new Date(timeDiff)); 

注意改變爲「HH」是日期格式,以24小時格式顯示時間。

+0

謝謝,這工作得很好。 – pilcrowpipe 2012-01-08 05:07:10

0

TL;博士

Duration.between( 
    LocalTime.of(12 , 5 , 0) , 
    LocalTime.of(12 , 7 , 0) 
).toString() 

PT2M

如果對我的強烈建議使用Duration,你堅持使用模棱兩可/混淆時間的天格式:

LocalTime.MIN.plus(
    Duration.between( 
     LocalTime.of(12 , 5 , 0) , 
     LocalTime.of(12 , 7 , 0) 
    ) 
).toString(); 

00:02

要強制所有三個組件(小時,分鐘,秒),請使用預定義的DateTimeFormatter.ISO_LOCAL_TIME

LocalTime.MIN.plus(
    Duration.between( 
     LocalTime.of(12 , 5 , 0) , 
     LocalTime.of(12 , 7 , 0) 
    ) 
).format(DateTimeFormatter.ISO_LOCAL_TIME) 

00:02:00

live code in IdeOne.com

時刻!=跨度的時間

不要濫用日期時間類,如java.util.Date存儲經過的時間。這樣的班級代表了一段時間,而不是一段時間。

避免遺留日期時類

不要使用舊麻煩日期時間類,如java.util.Date。那些現在被java.time類取代。

Instant

Instant類表示UTC時間軸與nanoseconds分辨率上一會兒。

獲取當前時刻。

Instant now = Instant.now(); 

模擬以後的時間。

Instant future = now.plus(Duration.ofMinutes(5)); 

Duration

捕獲經過的時間與一個或Duration對象Period。其中每個代表一段時間,第一個處理日 - 時 - 分 - 秒,第二個處理年 - 月 - 日。

Duration duration = Duration.between(now , future); 

字符串格式

要呈現的持續時間值作爲字符串,不使用時間 - 日期格式爲不明確。而是使用標準ISO 8601 format for durations。該格式PnYnMnDTnHnMnS標誌着P的開頭。中間的T將年 - 月 - 日部分與小時 - 分鐘 - 秒部分分開。例如,兩個半小時是PT2H30M。我們五分鐘的例子是PT5M

String output = duration.toString(); // PT5M 

LocalTime

如果你有一個實際時間的一天,並希望與填零格式化,使用LocalTime::toString的默認格式。

LocalTime.now(ZoneId.of("America/Montreal")).toString(); // 02:03:04.789Z 

另一個例子。再次,我做不是建議濫用LocalTime這種方式。 (相反,堅持Duration對經過的時間。)

LocalTime start = LocalTime.now(ZoneId.of("America/Montreal")); 
LocalTime stop = start.plusMinutes(7); 
Duration d = Duration.between(start , stop); 
LocalTime result = LocalTime.MIN.plus(d); // I do *not* recommend abusing `LocalTime` this way. Use `Duration` instead for elapsed time. 
DateTimeFormatter f = DateTimeFormatter.ISO_LOCAL_TIME ; 
String output = result.format(f); 
System.out.println("output: " + output); 

輸出:0時07分00秒

live code in IdeOne.com


關於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的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore