Código Java para encontrar la diferencia entre dos horas, donde la hora se almacena en el tipo de fecha y la hora está en formato de 24 horas [duplicado]

El problema con el uso Datees que todavía espera una fecha real a pesar de que está usando solo la parte del tiempo, por lo que si solo lo envía a la hora, no será correcto.

En su lugar, use LocalTimey ChronoUnit.HOURSpara obtener la diferencia entre el tiempo.

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");
LocalTime lt1 = LocalTime.parse(txtshiftIn, dtf);
LocalTime lt2 = LocalTime.parse(txtshiftOut, dtf);

long diff = ChronoUnit.HOURS.between(lt1, lt2);

Esto mostrará lo -16que significa que lt1está por delante de lo lt2que indica que lt2es el día siguiente para que podamos modificarlo para obtener las diferencias como tal

if (diff < 0) {
  diff += 24;
}

Esto le dará la 8diferencia horaria que espera.

ACTUALIZACIÓN Para contabilizar la diferencia en minutos, puede hacer lo siguiente:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");
LocalTime lt1 = LocalTime.parse(txtshiftIn, dtf);
LocalTime lt2 = LocalTime.parse(txtshiftOut, dtf);

long diff = ChronoUnit.MINUTES.between(lt1, lt2); //get diff in minutes

if (lt2.isBefore(lt1)) {
  diff += TimeUnit.DAYS.toMinutes(1); //add a day to account for day diff
}

long hours = diff / 60;
long minutes = diff % 60;

LocalTime newTime = LocalTime.parse(String.format("%02d:%02d", hours, minutes), dtf); //Format the difference to be converted to LocalTime

System.out.println(newTime);

Esto producirá la diferencia en minutos:

08:30

Actualización 2

Aquí hay un método más limpio que devuelve un Duration

public Duration timeDifference(String txtshiftIn, String txtshiftOut) {
  DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");
  LocalTime lt1 = LocalTime.parse(txtshiftIn, dtf);
  LocalTime lt2 = LocalTime.parse(txtshiftOut, dtf);

  Duration between = Duration.between(lt1, lt2);

  if (lt2.isBefore(lt1)) { //account for lt2 being on the next day
    between = Duration.ofMinutes(TimeUnit.DAYS.toMinutes(1)).plus(between);
  }

  return between;
}
Respuesta 1

Sé que se desaconseja el uso de literales de cadena en Android, pero no sé por qué. También me gustaría saber qué formas posibles pueden solucionar este problema.

Parte 1: suponga la siguiente pieza de código void method1 () {synchronized (lockObject) {method2 (); System.out.println ("línea4"); }} void method2 () {System.out.println ("...

Más fácil de demostrar con un ejemplo: Prueba de cadena = "salut ð \ u009F \ u0098 \ u0085 test"; Scanner scan = nuevo escáner (prueba); System.out.println ("1:" + scan.nextLine ()); System.out ....

Tengo este código c ++: / * Archivo: ejemplo.cpp * / #include <iostream> #include <time.h> double My_variable = 3.0; int fact (int n) {if (n <= 1) devuelve 1; de lo contrario, devuelve n * fact (n-1); } En t ...