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?
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
.
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);
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
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));
}
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 .
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);