2015-04-17 78 views
3

我正在使用String.format打印已用時間。這是工作偉大的幾分鐘:秒...String.format打印錯誤時間

long millis = 330000; 
String.format("%tMm%tSs", millis, millis); 

...將打印05m30s。

但是,當我嘗試在經過的時間中包含小時數時,小時數顯示爲19!起初,我認爲這是我的場所,但我已經嘗試了以下...

long millis = 330000; 
String.format(Locale.ITALY, "%tHh%tMm%tSs", millis, millis, millis); 

...我仍然得到19h05m30s。

你甚至可以嘗試

long millis = 0; 
String.format(Locale.ITALY, "%tHh", millis); 

,但你仍然可以得到19小時。

發生了什麼事?

+0

你是什麼意思的「當我嘗試在我的經過時間包括小時」? – 2015-04-17 12:59:24

+0

對不起,我在格式字符串中忘了格式化程序。我編輯了這個問題。 – naugler

+0

我爲第二個人獲得'01h05m30s' – Sionnach733

回答

1

long的值被視爲java.util.Date,而不是持續時間。這就是時區影響它的原因。您的毫秒值等於表示1970年1月1日00:05:30的日期UTC

嘗試製作相對於午夜的時間在本地時區:

long millis = 330000; 

System.out.printf("%THh%<tMm%<tSs%n", millis); 

Calendar cal = Calendar.getInstance(); 
cal.set(Calendar.HOUR_OF_DAY, 0); 
cal.set(Calendar.MINUTE, 0); 
cal.set(Calendar.SECOND, 0); 
cal.set(Calendar.MILLISECOND, 0); 

cal.add(Calendar.MILLISECOND, (int) millis); 

System.out.printf("%THh%<tMm%<tSs%n", cal); 
+0

謝謝,這是根本問題。我知道它會將價值看作是一個日期,但我想要表示1970年1月1日00:05:30(小時,分鐘和秒仍然只是從1970年1月1日00:00:00開始經過的時間)但是我不知道時區的處理方式。看到我自己的答案。 – naugler

-1

檢查modifiers,幾小時這是tl不是tHh

+0

H是24小時制的小時的有效修飾符,我想在小時後打印字母「h」 – naugler

+0

結果相同,但'3h05m30s'而不是'03h05m30s' –

0

Formatter doc

對於長,長,日期使用的時區是Java虛擬機實例的默認時區 。格式器的區域設置 將取代參數的區域設置(如果有的話)。

我猜Locale參數純粹是爲了格式化而不是時間計算。

0

請看下面的例子:

int s = 330; 
System.out.println(String.format("%d:%02d:%02d", s/3600, (s%3600)/60, (s%60))); 

我用秒,但這個例子還將努力爲毫秒,但你必須在示例中將每個數字加上000):

+0

不是我問的,但是我最終做了這樣的事情來避免時區問題。謝謝你的幫助。 – naugler

1

Joda-Time

庫有一些類可以智能地處理一段時間,讓你避免處理毫秒。

ISO 8601

ISO 8601標準定義類似於你要使用什麼樣的格式。 Joda-Time庫默認使用ISO 8601格式來解析和生成這樣的字符串。

不要那麼辛苦

換句話說,你正在努力工作。讓Joda-Time 2.7在這裏完成這項工作。

更好地指定您想要的時區,而不是隱式地依賴JVM的當前默認時區(可能會隨時改變)。

使用proper time zone names。切勿使用既不標準也不唯一的3或4字母代碼。

DateTimeZone zone = DateTimeZone.forID ("Europe/Rome"); 

通過捕獲當前時刻假冒一些數據,然後回退幾小時,幾分鐘和幾秒鐘。

DateTime now = DateTime.now (zone); 
DateTime then = now.minusHours(19).minusMinutes(5).minusSeconds (30); 

以兩種方式表示一段時間。首先是時間線上的一對固定點。其次,一些月,日,小時等

Interval interval = new Interval(then, now); // String representation defaults to the pair of date-time values displayed in ISO 8601 format. 
Period period = interval.toPeriod(); // String representation defaults to ISO 8601 format of PnYnMnDTnHnMnS. 

注意,PeriodtoString方法默認生成與你相似的ISO 8601標準格式,PnYnMnDTnHnMnS的字符串。 P標誌着開始,而T將日期部分與時間部分分開。

轉儲到控制檯。

System.out.println ("interval: " + interval); 
System.out.println ("period: " + period); 

運行時。

interval: 2015-04-18T12:16:55.700+02:00/2015-04-19T07:22:25.700+02:00 
period: PT19H5M30S 
+0

非常有幫助的例子,謝謝 – naugler