2013-01-05 120 views
2

我嘗試使用SimpleDateFormat格式化時間間隔。SimpleDateFormat無法格式化日期間隔?

import java.text.*; 
import java.util.*; 

public class DateFormatTest { 
    public static void main(String[] args) { 
    SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss"); 
    long interval = 1000; 
    System.out.println("Interval in millis: " + interval); 
    System.out.println("Expected result: 00:00:01"); 
    System.out.println("Result using Date and SimpleDateFormat: " + 
     sdf.format(new Date(interval))); 
    } 
} 

我得到以下結果:

Interval in millis: 1000 
Expected result: 00:00:01 
Result using Date and SimpleDateFormat: 01:00:01 

我在GMT + 1時區。但它不應該反映在結果中。

當然可以用System.out.printf來解決,但是我正在搜索的是原因。

+2

SimpleDateFormat用於格式化日期,而不是間隔,因此它實際打印的是GMT + 1曆元1000毫秒後的正確時間。您應該將SimpleDateFormat的時區設置爲UTC –

+0

對於24小時日期格式,也請使用「HH:mm:ss」,而不是「hh:mm:ss」。 hh是一個帶有有趣後果的錯誤。 –

+0

還有一個類似的問題,其中詳細介紹了System.out.printf解決方案:[java中的Timemillisecond到hh:mm:ss格式](http://stackoverflow.com/questions/14169873/timemillisecond-to-hhmmss-format- in-java/14169970#14169970) –

回答

3

我在GMT + 1時區。但它不應該反映在結果中。

然後你應該在SimpleDateFormat中設置時區。 SimpleDateFormat是做正是正確的事情 - 這是格式化時間瞬間的時區(午夜UTC 1970年以後只),它的工作在

要更改時區,只需使用:

sdf.setTimeZone(TimeZone.getTimeZone("etc/UTC")); 

儘管如此,您是否應該使用真的仍然使用SimpleDateFormat並不清楚。你不是想格式化一個日期/時間 - 你試圖格式區間,給定你的變量名稱。

我建議你使用Joda Time具有豐富的類型系統,並允許你表達你真的想要什麼。

此外,如果你真的使用SimpleDateFormat,你可能想在你的格式字符串使用HH而不是hh。 (hh是12小時值,1-12,你想要00:00:01,而不是12:00:01)hh很少適合,當你不需要時在你的模式中有一個am/pm指示符。

+0

根據javadoc,這是GMT而不是UTC(雖然它似乎是相同的具體日期)。 – assylias

+1

@assylias:UTC是一個更好的表達,海事組織 - 它並沒有綁定到一個地方。在Unix時代使用UTC特別有用,因爲人們通常會認爲英國在1970年初觀察了GMT,實際上並沒有。 (有一個去UTC + 1的實驗。)我懷疑文檔是歷史的,但我認爲使用UTC通常更清晰。無可否認,UTC只是在1970年後才引入,但...... –

4

我在格林威治標準時間+1時區。但不應該在結果中反映出來。

是什麼讓你這麼想? new Date(0)是在1月1日1970 00:00 AM GMT因此,它是在凌晨01:00,如果您的默認時區爲GMT + 1

+0

對不起,我只是想不知何故Date使用本地時區。 –