Come convertire i secondi in questo formato “HH:mm:ss”

Vorrei convertire i secondi/millisecondi in questo formato “HH:mm:ss” (per esamples, da 5 secondi a 00:00:05). Ho cercato di ottenere che il formato in questo modo:

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

In che modo ottengo “01:00:05” e non “00:00:05”. Dove sbaglio?

InformationsquelleAutor Webman | 2012-02-09

 

6 Replies
  1. 20

    Fusi orari.

    Lungo valore 5000 significa che 5 secondi dopo l’epoca. Per la maggior parte dei fusi orari, 5 secondi dopo l’epoca non è 5 secondi dopo la mezzanotte ora locale.

    Java 8 update:

    java.time.LocalTime gestirà l’idea di un orologio da parete “ora del giorno”, senza doversi preoccupare i fusi orari e giorni implicita nell’ java.util.Date. Se è possibile utilizzare Java 8, e di durate sarà sempre meno di un giorno, quindi una versione corretta del tuo esempio può essere semplice come:

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

    (Credo che a rigor di termini, java.time.Duration è meglio modello di ciò che si vuole, in quanto rappresenta un certo numero di secondi, piuttosto che di un momento della giornata. Ma è un dolore nel formato hh:mm:ss, quindi, se stai sempre a che fare con sub-24 ore valori, TimeOfDay ti dà questa formattazione gratis e in caso contrario è equivalente).


    Se sei bloccato con Java 7 o al di sotto, quindi specificare in modo esplicito un fuso orario di GMT nel tuo esempio di codice dovrebbe dare l’output previsto.

    Ecco una Scala REPL sessione di illustrare il problema, e Java 7, soluzione, sulla mia macchina:

    scala> val millis = 5000
    millis: Int = 5000
    
    scala> val df = new java.text.SimpleDateFormat("HH:mm:ss")
    df: java.text.SimpleDateFormat = java.text.[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

    Così si può vedere che il mio fuso orario predefinito è GB, che ha 1 ora di differenza rispetto al GMT, al momento indicato da 5000L. Impostazione del fuso orario a GMT gievs l’uscita prevista di 00:00:05.

    • Sei sicuro che questo è il fuso orario correlati? Io sono nel fuso orario GMT, e chiamando df.getTimeZone() nel codice di cui sopra restituisce id="Europe/London" e ho la stessa uscita di “01:00:05”.
    • Sì, Londra è 1 ora avanti rispetto all’ora di greenwich nel periodo in questione (secondo Java almeno). Vedere la mia modifica per un esempio pratico.
    • Sue opere. Ho aggiunto questo df.setTimeZone(TimeZone.getTimeZone("GMT"));
    • Solo per aggiungere che, se si dispone di più di 24 ore, le ore mostrerà solo il resto (ad esempio, per 34h, verrà restituito 10:00:00). Non ho trovato una soluzione per includere giorni (utilizzando DD inizia il conteggio da 1, quindi 34h sarebbe 02:10:00:00, invece di 01:10:00:00) o per più di 24 ore (es. 34:00:00).
    • nella maggior parte dei casi, probabilmente, non è molto importante, ma LocalTime soluzione sembra anche essere più veloce rispetto all’utilizzo di SimpleDateFormat. Ho ottenuto il 100 ms invece di 350 per un milione di corre
  2. 12

    Ho ottenuto questo lavoro. Fammi sapere se funziona per voi. Sembra un sacco di linee per fare qualcosa di apparentemente semplice..

        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);
    • questo ha funzionato per me. se qualcuno trova un modo migliore, per favore fatemelo sapere. p.s il suo bene sapere che java è ancora carente semplice Data/Ora di funzionalità.
    • Si può essere tristi per imparare il Java 8 non sono molto meglio di Data/Ora di funzionalità(!). Ho aggiornato la mia risposta con un esempio di utilizzo del nuovo java.time pacchetto.
    • Grazie, non sembra essere più bello in java 8 🙂
  3. 5

    Si dovrebbe ottenere SimpleDateFormat con Locale argomento.

    public static String getDateFromMillis(long millis) {
        SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
        return formatter.format(new Date(millis));
    }
    • Bello! Grazie.
    • Non c’è bisogno di creare una nuova Data ogni volta. formatter.formato(millis); anche di lavoro.
  4. 5

    Ho scritto una semplice funzione di utilità per questa attività che non richiede alcuna versione di Java, né crea inutili oggetti:

    /**
     * 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 / 3600, (secs % 3600) / 60, secs % 60);
    }

    A differenza di altre soluzioni qui, questo può anche trattare fino a 100 ore

  5. 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);
    • Mettere una breve descrizione di che tipo di problema che si sta affrontando.
    • Non più lucido risposta … ma funziona davvero bene.
    • Utilizza La Stringa.formato, questo potrebbe essere fatto molto più bello, simile a Oles Risposta, anche senza Java 9
  6. 1

    Java 9 risposta:

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

    (non ancora testato)

    Il toXxPart metodi sono descritti in l’API docs per Java 9.

Lascia un commento