2012-02-09 115 views
22

我想將這種格式的「HH:mm:ss」(例如從5秒到00:00:05)轉換成秒/毫秒, 。我試圖讓這種方式這種格式:如何轉換格式爲「HH:mm:ss」的秒數

int millis = 5000; 
SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); 
String time = df.format(millis); 

這樣一來,我得到「1點00分05秒」,而不是「00:00:05」。我錯在哪裏?

+0

可能重複的[如何將毫秒轉換爲「X分鐘,在Java中X秒」](http://stackoverflow.com/questions/625433/how-to-convert-milliseconds-to-x-mins-x-秒在Java) – 2014-03-04 15:57:27

+1

此問題有更好的答案[這裏](http://stackoverflow.com/a/625624/685806)和[這裏](http://stackoverflow.com/a/266970/685806)。 – Pino 2012-05-11 14:33:54

+0

[如何將時間以秒爲單位轉換爲MySQL中的HH:MM:SS格式?](http://stackoverflow.com/questions/18911455/how-to-convert-time-in-seconds-to-hhmmss -format-in-mysql) – 2015-01-13 09:15:37

回答

16

時區。

長值5000意味着在紀元後5秒。對於大多數時區而言,曆元5秒後不是當地時間午夜過後的5秒。

的Java 8更新

java.time.LocalTime將處理掛鐘「一天中的時間」的想法,您無需擔心時區和天java.util.Date隱。如果你可以使用Java 8,你的持續時間將永遠是不到一天的時間,那麼你的示例的正確版本可以是簡單的:

int millis = 5000; 
int seconds = millis/1000; // Maybe no need to divide if the input is in seconds 
LocalTime timeOfDay = LocalTime.ofSecondOfDay(seconds); 
String time = timeOfDay.toString(); 

(我猜嚴格地說,java.time.Duration是一個更好的模型你想要什麼,因爲它代表了一定的秒數,而不是一天的時間,但是格式化爲hh:mm:ss是一種痛苦,所以如果你總是處理24小時以下的值,的TimeOfDay給你這個格式爲自由和爲其他等效)。


如果你堅持使用Java 7或以下,然後在示例代碼中明確指定一個時區GMT應該會給出您期望的輸出。

這裏是Scala的REPL會話演示問題,以及Java 7的解決方案,我的機器上:

scala> val millis = 5000 
millis: Int = 5000 

scala> val df = new java.text.SimpleDateFormat("HH:mm:ss") 
df: java.text.SimpleDateFormat = [email protected] 

scala> df.format(millis) 
res0: java.lang.String = 01:00:05 

scala> df.getTimeZone.getID 
res1: java.lang.String = GB 

scala> df.getTimeZone.getOffset(millis) 
res2: Int = 3600000 

scala> df.setTimeZone(java.util.TimeZone.getTimeZone("GMT")) 

scala> df.format(millis) 
res3: java.lang.String = 00:00:05 

所以你可以看到我的默認時區是GB,其中有1個小時,從格林尼治時間偏移時間由5000L表示。將時區設置爲GMT gievs的預期輸出爲00:00:05

+1

你確定這是與時區相關的嗎?我在GMT時區,並在上面的代碼中調用'df.getTimeZone()'返回'id =「Europe/London」',我得到相同的輸出「01:00:05」。 – 2012-02-09 16:51:58

+0

沒錯,倫敦在格林威治標準時間提前1小時(根據Java至少)。查看我編輯的工作示例。 – 2012-02-09 18:21:07

+0

這是工作。我添加了這個'df.setTimeZone(TimeZone.getTimeZone(「GMT」));' – Webman 2012-02-10 09:44:42

12

我得到了這個工作。請讓我知道這對你有沒有用。好像很多線路做一些看似簡單的..

int millis = 5000; 
    TimeZone tz = TimeZone.getTimeZone("UTC"); 
    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); 
    df.setTimeZone(tz); 
    String time = df.format(new Date(millis)); 
    System.out.println(time); 
+0

這也適用於我。 如果有人找到更好的方法,請讓我知道。 p.s它很好地知道,java仍然缺乏簡單的日期/時間功能。 – APT 2014-08-28 13:59:31

+1

@APT - 您可能很難過得知Java 8確實有更好的日期/時間功能(!)。我已經使用新的'java.time'包更新了我的答案。 – 2015-01-13 12:18:54

+0

謝謝,它似乎在java 8更好:) – APT 2015-01-20 16:17:29

1
public class HHMMSS { 

     final int UUR = 3600; 
     final int MINUUT = 60; 

    public void converteerTijd() { 

     int uren, minuten, seconden, ingave; 
     System.out.print("Geef een aantal seconden: "); 
     ingave = Input.readInt(); 
     uren = ingave/UUR; 
     minuten = (ingave - uren * UUR)/MINUUT; 
     seconden = ingave - uren * UUR - minuten * MINUUT; 
     String nU1 = (uren < 10) ? "0" : ""; 
     String nM1 = (minuten < 10) ? "0" : ""; 
     String nS1 = (seconden < 10) ? "0" : ""; 
     System.out.println(nU1 + uren + "-" + nM1 + minuten + "-" + nS1 + seconden); 
+0

簡要說明你面臨的是什麼樣的問題。 – Abs 2015-01-13 08:53:47

+0

不是最精緻的答案......但它運作得非常好。 – 2016-09-28 11:46:41

+0

使用String.format,這可以做得更好,類似於[Oles Answer](https://stackoverflow.com/a/43368279/6723250),即使沒有Java 9 – Xerus 2017-12-15 23:50:58

5

你應該與區域設置參數得到的SimpleDateFormat。

public static String getDateFromMillis(long millis) { 
    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()); 
    return formatter.format(new Date(millis)); 
} 
+0

好!謝謝。 – t0m 2016-07-14 12:11:19

+1

您不需要每次都創建一個新日期。 formatter.format(米利斯);也將起作用。 – 2017-10-11 09:12:03

1

爪哇9答案:

Duration dur = Duration.ofMillis(millis); 
    System.out.println(String.format("%02d:%02d:%02d", 
         dur.toHours(), dur.toMinutesPart(), dur.toSecondsPart())); 

(尚未測試)

toXxPart方法在the API docs for Java 9說明。

0

我寫了一個簡單的效用函數完成這個任務,它不需要任何Java版本,也沒有實例化任何不必要的對象:

/** 
* provides a String representation of the given time 
* @return {@code millis} in hh:mm:ss format 
*/ 
public static final String formatTime(long millis) { 
    long secs = millis/1000; 
    return String.format("%02d:%02d:%02d", (secs % 86400)/3600, (secs % 3600)/60, secs % 60); 
} 

不像這裏介紹一些其他的解決方案,這甚至可以處理多達100個小時

相關問題