web-dev-qa-db-fra.com

Comment convertir les secondes dans ce format "HH: mm: ss"

Je veux convertir la seconde/millisecondes dans ce format "HH: mm: ss" (pour les exemples, de 5 secondes à 00:00:05). J'ai essayé d'obtenir ce format de cette manière:

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

De cette façon, j'obtiens "01:00:05" et non "00:00:05". Où ai-je tort?

27
Webman

Fuseaux horaires.

La valeur longue 5000 signifie 5 secondes après l'époque. Pour la majorité des fuseaux horaires, 5 secondes après l'Époque n'est pas 5 heures après minuit heure locale.

mise à jour Java 8:

Java.time.LocalTime gérera l'idée d'une horloge murale "heure du jour" sans que vous ayez à vous soucier des fuseaux horaires et des jours implicites dans Java.util.Date. Si vous pouvez utiliser Java 8, et que vos durées seront toujours inférieures à un jour, alors une version correcte de votre exemple peut être aussi simple que:

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

(Je suppose à proprement parler, Java.time.Duration est un meilleur modèle de ce que vous voulez, en ce qu'il représente un certain nombre de secondes, plutôt qu'une heure du jour. Mais c'est pénible de formater en hh: mm: ss, donc si vous avez toujours affaire à des valeurs inférieures à 24 heures, TimeOfDay vous donne ce formatage gratuitement et est par ailleurs équivalent.)


Si vous êtes bloqué avec Java 7 ou inférieur, alors spécifier explicitement un fuseau horaire de GMT dans votre exemple de code devrait vous donner la sortie que vous attendez.

Voici une Scala REPL session démontrant le problème, et Java 7 solution, sur ma machine:

scala> val millis = 5000
millis: Int = 5000

scala> val df = new Java.text.SimpleDateFormat("HH:mm:ss")
df: Java.text.SimpleDateFormat = Java.text.SimpleDateFormat@8140d380

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

Vous pouvez donc voir que mon fuseau horaire par défaut est GB, qui a un décalage d'une heure par rapport à GMT à l'heure indiquée par 5000L. La définition du fuseau horaire sur GMT donne la sortie attendue de 00:00:05.

21
Andrzej Doyle

Je l'ai fait fonctionner. Dites-moi si cela marche pour vous. On dirait beaucoup de lignes pour faire quelque chose d’apparemment simple ..

    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);
12
B. Anderson

J'ai écrit une fonction utilitaire simple pour cette tâche qui ne nécessite aucune Java ni instancie aucun objet inutile:

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

Contrairement à d'autres solutions ici, cela peut même prendre en charge jusqu'à 100 heures

6
Xerus

Vous devez obtenir SimpleDateFormat avec l'argument Locale.

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

Réponse de Java 9:

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

(pas encore testé)

Les méthodes toXxPart sont décrites dans les documents API pour Java 9 .

1
Ole V.V.
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);
1
maxim delaet