2012-02-09 13 views
22

Chcę przekonwertować sekundy/milisekundy w tym formacie "HH: mm: ss" (dla esamples, od 5 sekund do 00:00:05) . Próbowałem dostać ten format w następujący sposób:Jak przekonwertować sekundy w tym formacie "HH: mm: ss"

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

W ten sposób otrzymuję „01:00:05”, a nie „00:00:05”. Gdzie się mylę?

+0

możliwy duplikat [Jak konwertować milisekundy na "X mins, x seconds" w Javie?] (Http://stackoverflow.com/questions/625433/how-to-convert-milliseconds-to-x-mins-x- seconds-in-java) –

+1

To pytanie ma lepsze odpowiedzi [tutaj] (http://stackoverflow.com/a/625624/685806) i [tutaj] (http://stackoverflow.com/a/266970/685806). – Pino

+0

możliwy duplikat [Jak przeliczać czas w sekundach na format HH: MM: SS w MySQL?] (Http://stackoverflow.com/questions/18911455/how-to-convert-time-in-seconds-to-hhmmss -format-in-mysql) –

Odpowiedz

16

Strefy czasowe.

Długa wartość 5000 oznacza 5 sekund po epoce. W przypadku większości stref czasowych, 5 sekund po epoce nie jest 5 sekund po północy czasu lokalnego.

Java 8 aktualizacja:

java.time.LocalTime zajmie się pomysł na ścianie zegar „Time of Day” bez konieczności martwić o strefach czasowych i dni ukrytych w java.util.Date. Jeśli można użyć Java 8, a twoja trwania zawsze będzie mniej niż jeden dzień, to poprawna wersja swoim przykładem może być tak proste, jak:

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(); 

(Chyba ściśle mówiąc, java.time.Duration jest lepszym modelu z tego, co chcesz, ponieważ reprezentuje pewną liczbę sekund, a nie porę dnia, ale formatowanie to hh: mm: ss, więc jeśli zawsze masz do czynienia z wartościami z okresu poniżej 24 godzin , TimeOfDay daje to formatowanie za darmo, a poza tym jest równoważne.)


Jeśli utkniesz z Java 7 lub niższą, następnie jednoznaczne określenie strefy czasowej GMT w przykładowym kodzie powinno dać wynik, którego oczekujesz.

Oto sesja Scala REPL wykazując problemu i Java 7 rozwiązanie, na moim komputerze:

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 

Więc widzę, że moja domyślna strefa czasowa jest GB, który ma 1 godzinę przesunięcie GMT na czas oznaczony 5000L. Ustawienie strefy czasowej na GMT wyświetla oczekiwany wynik 00:00:05.

+1

Czy jesteś pewien, że jest to powiązane ze strefą czasową? Jestem w strefie czasowej GMT, a wywołanie 'df.getTimeZone()' w powyższym kodzie zwraca 'id =" Europe/London "' i otrzymuję to samo wyjście "01:00:05". –

+0

Tak, Londyn był 1 godzinę przed GMT w danym czasie (zgodnie z Java przynajmniej). Zobacz moją edycję sprawdzonego przykładu. –

+0

To działa. Dodałem to 'df.setTimeZone (TimeZone.getTimeZone (" GMT "));' – Webman

12

Mam to do pracy. Daj mi znać, czy to działa dla Ciebie. Wydaje się dużo linii do zrobienia czegoś pozornie proste ..

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

to działało również dla mnie. jeśli ktoś znajdzie lepszy sposób, proszę dać mi znać. p.s dobrze jest wiedzieć, że java wciąż brakuje prostej funkcji daty/czasu. – APT

+1

@APT - Możesz być smutny, gdy dowiesz się, że Java 8 ma znacznie lepszą funkcjonalność Data/Czas (!). Zaktualizowałem swoją odpowiedź na przykładzie przy użyciu nowego pakietu 'java.time'. –

+0

Dzięki, wydaje się być ładniejszy w java 8 :) – APT

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

Dodaj krótki opis, z jakim rodzajem problemu masz do czynienia. – Abs

+0

Nie najbardziej dopracowana odpowiedź ... ale działa naprawdę dobrze. –

+0

Używając String.format, można to zrobić znacznie ładniej, podobnie jak [Odpowiedź Olesa] (https://stackoverflow.com/a/43368279/6723250), nawet bez Java 9 – Xerus

5

Powinieneś dostać SimpleDateFormat z argumentem Locale.

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

Nice! Dziękuję Ci. – t0m

+1

Za każdym razem nie trzeba tworzyć nowej daty. formatter.format (millis); również zadziała. –

1

Java 9 odpowiedź:

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

(jeszcze sprawdzony)

W toXxPart metody są opisane w the API docs for Java 9.

0

napisałem prostą funkcję użytkową dla tego zadania, które nie wymagają żadnej wersji Java ani wystąpienie niepotrzebnych przedmiotów:

/** 
* 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); 
} 

W odróżnieniu od innych rozwiązań tutaj, to może nawet zajmować się maksymalnie do 100 godzin

Powiązane problemy