java - example - simpledateformat android
Cómo convertir los segundos en este formato "HH: mm: ss" (6)
Quiero convertir el segundo / milisegundo en este formato "HH: mm: ss" (para las muestras, de 5 segundos a 00:00:05). Traté de obtener ese formato de esta manera:
int millis = 5000;
SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
String time = df.format(millis);
De esa manera, obtengo "01:00:05" y no "00:00:05". ¿Dónde estoy equivocado?
Debería obtener SimpleDateFormat con el argumento Locale.
public static String getDateFromMillis(long millis) {
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
return formatter.format(new Date(millis));
}
Escribí una función de utilidad simple para esta tarea que no requiere ninguna versión de Java ni instancia ningún objeto innecesario:
/**
* 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);
}
A diferencia de algunas otras soluciones aquí, esto puede incluso tratar con hasta 100 horas
Respuesta de Java 9:
Duration dur = Duration.ofMillis(millis);
System.out.println(String.format("%02d:%02d:%02d",
dur.toHours(), dur.toMinutesPart(), dur.toSecondsPart()));
(no probado aún)
Los métodos toXxPart
se describen en los documentos API para Java 9 .
Tengo esto para trabajar. Avíseme si funciona para usted. Parece que hay muchas líneas para hacer algo aparentemente 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);
Zonas horarias.
El valor largo 5000
significa 5 segundos después de la época. Para la mayoría de las zonas horarias, 5 segundos después de la época no son 5 segundos después de la medianoche, hora local.
Actualización de Java 8 :
java.time.LocalTime
manejará la idea de un reloj de pared "hora del día" sin tener que preocuparse por las zonas horarias y los días implícitos en java.util.Date
. Si puede usar Java 8, y sus duraciones siempre serán menos de un día, entonces una versión correcta de su ejemplo puede ser tan simple como:
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();
(Supongo que estrictamente hablando, java.time.Duration
es un mejor modelo de lo que quieres, ya que representa una cierta cantidad de segundos, en lugar de una hora del día. Pero es un dolor formatear en hh: mm: ss, por lo que si siempre tiene que lidiar con valores inferiores a 24 horas, TimeOfDay le ofrece este formato de forma gratuita y por lo demás es equivalente).
Si está atascado con Java 7 o inferior, entonces la especificación explícita de una zona horaria de GMT
en su código de ejemplo debería darle el resultado que espera.
Aquí hay una sesión de Scala REPL que demuestra el problema, y la solución de Java 7, en mi máquina:
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
Así que puedes ver que mi zona horaria predeterminada es GB
, que tiene un desplazamiento de 1 hora desde GMT en el momento indicado por 5000L
. Al establecer la zona horaria en GMT, se obtiene la salida esperada de 00:00:05
.
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);