Quiero restar dos periodos de tiempo, digamos 16:00:00 de 19:00:00. ¿Hay alguna función de Java para esto? Los resultados pueden estar en milisegundos, segundos o minutos.
¿Y al revés? 16:00 - 19:00? ¿Cómo puedo calcular esto?
Alex Kapustian
Invertir las variables no servirá de mucho. En este ejemplo, claro, podría invertirlas y tomar el valor absoluto o algo así. Pero, ¿qué pasa si tienes medianoche (00:00)?
rj2700
¿Y de 23:15:00 a 01:15:00?
Oleksandr
¿Qué hay de la diferencia entre las 08:00:00 de hoy y las 10:00:00 de ayer ??????? No creo que lo que sugieres sea una lógica rompible.
Realmente me gustó tu respuesta. ¡Muy elegante! :)
Avinash
Así que esto se reduce a dos importaciones y System.out.println("Duration: " + String.valueOf(Duration.between(outerstart, Instant.now()).toMillis()));registrar la duración. No llamaría a eso una solución agradable y limpia en Java8 si otros lenguajes pueden hacerlo con un código como print("Duration: " + str(time.time()-start))...
Luc
3
@Luc limpieza no es lo mismo que brevedad. Es mucho más claro exactamente lo que está sucediendo en la versión de Java 8, y también es mucho más fácil de modificar si, por ejemplo, desea informar la duración entre dos instantes en una unidad que no sea milisegundos, o como unidades múltiples (por ejemplo, en 1h 15m 3.022slugar de 4503022 milliseconds) .
JakeRobb
40
PARA obtener bonitas diferencias de tiempo, entonces
Esto también está disponible para Java SE 6 y 7 como puerto posterior , así como para Android .
Bryan
11
Como cualquier otro idioma; Convierta sus períodos de tiempo a una marca de tiempo Unix (es decir, segundos desde la época Unix) y luego simplemente reste. Luego, los segundos resultantes deben usarse como una nueva marca de tiempo de Unix y leerse formateados en el formato que desee.
Ah, dale al cartel de arriba (genesiss) su debido crédito, el código siempre es útil;) Sin embargo, ahora también tienes una explicación :)
import java.util.Date;...Date d1 =newDate();......Date d2 =newDate();System.out.println(d2.getTime()-d1.getTime());//gives the time difference in milliseconds. System.out.println((d2.getTime()-d1.getTime())/1000);//gives the time difference in seconds.
y, para mostrar en un formato más agradable, puede usar:
Esto duplica otra respuesta y no agrega contenido nuevo. No publique una respuesta a menos que tenga algo nuevo que aportar.
DavidPostill
@DavidPostill, gracias por su atención. Pero la solución que necesitaba y no encontré en la publicación de GENESIS fue la diferencia de tiempo entre la ejecución de dos líneas de código (como el punto de inicio y el punto final del programa o antes y después de ejecutar un método, no algunos tiempos estáticos) . Pensé que esto podría ayudar.
Alisa
2
La forma dolorosa es convertir a milis y hacer la resta y luego volver a los segundos que desee. La mejor forma es utilizar JodaTime .
Nunca mencioné las marcas de tiempo de Unix. También es un hecho bien conocido que la API de fecha y hora de Java apesta para un uso más que ocasional. JodaTime es mucho mejor y probablemente sea el camino a seguir hasta que JSR 310 sea parte de Java. sourceforge.net/apps/mediawiki/threeten/…
Manfred Moser
@Manfred Moser: debería haberlo hecho ... Tanto las clases de tiempo predeterminadas de Java como Joda dan un tiempo en milisegundos que comienza en lo que se llama la época de Unix . En este punto, se acercan mucho a las marcas de tiempo de Unix (una en milisegundos y la otra en segundos). En cualquier caso, lo que quiere el OP se puede hacer trivialmente utilizando las clases de Java predeterminadas, tomando el número de milis desde la época de Unix y restándolos.
Sintaxis T3rr0r
1
Seguro que se puede hacer trivialmente. Y si realiza muchos cálculos de fecha y hora en su aplicación, también puede crear trivialmente muchos errores usted mismo y reinventar su propia pequeña biblioteca implementando partes de JodaTime usted mismo nuevamente. Para un cálculo simple que podría estar bien, pero para un uso frecuente, vale la pena usar una biblioteca decente. Solo estoy tratando de señalar que la primera solución simple podría no llevarlo por el mejor camino. ¿Qué está mal con eso?
Manfred Moser
3
@Manfred Moser: En realidad, la primera solución simple es el camino correcto, considerando que el OP pidió la diferencia entre dos períodos de tiempo, no cambios en un reloj atómico :)
Christian
Claro ... solo para este ejemplo y pregunta específica. Sin embargo, no para el panorama general.
Manfred Moser
2
String start ="12:00:00";String end ="02:05:00";SimpleDateFormat format =newSimpleDateFormat("HH:mm:ss");Date date1 = format.parse(start);Date date2 = format.parse(end);long difference = date2.getTime()- date1.getTime();int minutes =(int)TimeUnit.MILLISECONDS.toMinutes(difference);if(minutes<0)minutes +=1440;
Ahora los minutos serán la duración correcta entre dos tiempos (en minutos).
Además del enfoque más común con los objetos Periodo y Duración, puede ampliar sus conocimientos con otra forma de lidiar con el tiempo en Java.
Bibliotecas avanzadas de Java 8.
ChronoUnit para las diferencias.
ChronoUnit es una excelente manera de determinar qué tan separados están dos valores Temporales. Temporal incluye LocalDate , LocalTime y así sucesivamente.
LocalTime one =LocalTime.of(5,15);LocalTime two =LocalTime.of(6,30);LocalDate date =LocalDate.of(2019,1,29);System.out.println(ChronoUnit.HOURS.between(one, two));//1System.out.println(ChronoUnit.MINUTES.between(one, two));//75System.out.println(ChronoUnit.MINUTES.between(one, date));//DateTimeException
El primer ejemplo muestra que entre trunca en lugar de rondas.
El segundo muestra lo fácil que es contar diferentes unidades.
Y el último ejemplo nos recuerda que no debemos estropear las fechas y horas en Java :)
Date start =newDate();//Waiting for 10 secondsThread.sleep(10000);Date end =newDate();long diff = end.getTime()- start.getTime();StringTimeTaken=String.format("[%s] hours : [%s] mins : [%s] secs",Long.toString(TimeUnit.MILLISECONDS.toHours(diff)),TimeUnit.MILLISECONDS.toMinutes(diff),TimeUnit.MILLISECONDS.toSeconds(diff));System.out.println(String.format("Time taken %s",TimeTaken));
Salida : Tiempo empleado [0] horas: [0] minutos: [10] segundos
Si bien este código puede responder a la pregunta, proporcionar un contexto adicional sobre por qué y / o cómo este código responde a la pregunta mejora su valor a largo plazo.
Respuestas:
La diferencia está en milisegundos.
He modificado después sfaizs .
fuente
Java 8 tiene una solución más limpia : Instantánea y Duración
Ejemplo:
fuente
System.out.println("Duration: " + String.valueOf(Duration.between(outerstart, Instant.now()).toMillis()));
registrar la duración. No llamaría a eso una solución agradable y limpia en Java8 si otros lenguajes pueden hacerlo con un código comoprint("Duration: " + str(time.time()-start))
...1h 15m 3.022s
lugar de4503022 milliseconds
) .PARA obtener bonitas diferencias de tiempo, entonces
fuente
Java 8
fuente
Como cualquier otro idioma; Convierta sus períodos de tiempo a una marca de tiempo Unix (es decir, segundos desde la época Unix) y luego simplemente reste. Luego, los segundos resultantes deben usarse como una nueva marca de tiempo de Unix y leerse formateados en el formato que desee.
Ah, dale al cartel de arriba (genesiss) su debido crédito, el código siempre es útil;) Sin embargo, ahora también tienes una explicación :)
fuente
y, para mostrar en un formato más agradable, puede usar:
fuente
La forma dolorosa es convertir a milis y hacer la resta y luego volver a los segundos que desee. La mejor forma es utilizar JodaTime .
fuente
Ahora los minutos serán la duración correcta entre dos tiempos (en minutos).
fuente
lanza excepciones maneja las excepciones de análisis
fuente
Además del enfoque más común con los objetos Periodo y Duración, puede ampliar sus conocimientos con otra forma de lidiar con el tiempo en Java.
Bibliotecas avanzadas de Java 8. ChronoUnit para las diferencias.
ChronoUnit es una excelente manera de determinar qué tan separados están dos valores Temporales. Temporal incluye LocalDate , LocalTime y así sucesivamente.
El primer ejemplo muestra que entre trunca en lugar de rondas.
El segundo muestra lo fácil que es contar diferentes unidades.
Y el último ejemplo nos recuerda que no debemos estropear las fechas y horas en Java :)
fuente
Opción alternativa si se toma el tiempo de diferentes días, por ejemplo: 22:00 y 01:55.
fuente
}
fuente
Prueba esto:
fuente
fuente
Encontré esto más limpio.
fuente
fuente
class TimeCalculator {String updateTime;
fuente