我試圖顯示一個時間差異到一個字符串後面的形式00:00:00(小時:分鐘:秒),零填充。我有以下代碼:DateFormat中的零填充小時
long timeDiff = System.currentTimeMillis() - mStartRecordingTime;
time = DateFormat.format("hh:mm:ss", timeDiff).toString();
我在測試它時,timeDiff測量是不超過幾秒鐘,但小時不顯示爲00.我在順便JST時區。
我試圖顯示一個時間差異到一個字符串後面的形式00:00:00(小時:分鐘:秒),零填充。我有以下代碼:DateFormat中的零填充小時
long timeDiff = System.currentTimeMillis() - mStartRecordingTime;
time = DateFormat.format("hh:mm:ss", timeDiff).toString();
我在測試它時,timeDiff測量是不超過幾秒鐘,但小時不顯示爲00.我在順便JST時區。
你從哪裏得到mStartRecordingTime?它看起來並不像我在同一個語言環境中用System.currentTimeMillis()設置的那樣;如果是的話,那麼時差就會反映出實際的差異,並且這將起作用。看起來,記錄時間以某種方式與UTC相距約9小時。
另一張海報是正確的,用這個值產生的日期將是接近時代,但如果你只是想獲得小時,分鐘和秒,那麼你應該是沒問題的。請記住,你正在處理已用時間,而不是時鐘/日曆時間,所以我不希望日期格式(而不是時間格式)能夠爲你工作。
我用另一個類來設置它: mRecorder.mStartRecordingTime = System.currentTimeMillis(); – pilcrowpipe 2012-01-08 05:11:17
long timeDiff = System.currentTimeMillis() - mStartRecordingTime;
String time = new SimpleDateFormat("hh:mm:ss").format(new Date(timeDiff));
小心那裏,timeDiff只會是幾秒鐘,所以新的日期(timeDiff)會在1970年給你一個日期 – Sean 2012-01-08 02:28:37
您需要補償的時區。用你所擁有的,將日期格式化器改爲使用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小時格式顯示時間。
謝謝,這工作得很好。 – pilcrowpipe 2012-01-08 05:07:10
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
不要濫用日期時間類,如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秒
的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
,YearQuarter
和more。
實際的問題是小時顯示爲09而不是00. – pilcrowpipe 2012-01-08 02:19:07
而不是顯示經過時間作爲時間(模糊和混亂),使用標準的[ISO 8601持續時間](https:// en .wikipedia.org/wiki/ISO_8601#持續時間)'PnYnMnDTnHnMnS'格式,例如'PT4S'四秒鐘。 – 2017-01-16 00:18:00