Calcular la diferencia entre dos veces android

Estoy desarrollando y la aplicación android, donde tengo que calcular la diferencia entre dos times.I necesidad de calcular la diferencia de tiempo de 24 horas, y también la diferencia entre los tiempos en dos días (por ejemplo, 5 pm hoy a las 9 am mañana).

He intentado el código abajo, para calcular la diferencia que trabaja solamente por 24 horas,

String dateStart = "08:00:00"; String dateStop = "13:00:00"; //HH converts hour in 24 hours format (0-23), day calculation SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss"); Date d1 = null; Date d2 = null; try { d1 = format.parse(dateStart); d2 = format.parse(dateStop); //in milliseconds long diff = d2.getTime() - d1.getTime(); long diffHours = diff / (60 * 60 * 1000) % 24; Log.e("test",diffHours + " hours, "); } catch (Exception e) { // TODO: handle exception } 

Seńor, puedes hacerlo fácilmente usando la función java. long difference = date2.getTime() - date1.getTime(); Echa un vistazo en este enlace esto te ayudará.

Usted puede intentar algo como esto también si está seguro de que el 9 de la mañana es el día siguiente puede agregar un día y calcular la diferencia:

 String string1 = "05:00:00 PM"; Date time1 = new SimpleDateFormat("HH:mm:ss aa").parse(string1); Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(time1); String string2 = "09:00:00 AM"; Date time2 = new SimpleDateFormat("HH:mm:ss aa").parse(string2); Calendar calendar2 = Calendar.getInstance(); calendar2.setTime(time2); calendar2.add(Calendar.DATE, 1); Date x = calendar1.getTime(); Date xy = calendar2.getTime(); long diff = x.getTime() - xy.getTime(); diffMinutes = diff / (60 * 1000); float diffHours = diffMinutes / 60; System.out.println("diff hours" + diffHours); 

Manera correcta de encontrar la diferencia de tiempo adecuada:

 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm"); Date startDate = simpleDateFormat.parse("22:00"); Date endDate = simpleDateFormat.parse("07:00"); long difference = endDate.getTime() - startDate.getTime(); if(difference<0) { Date dateMax = simpleDateFormat.parse("24:00"); Date dateMin = simpleDateFormat.parse("00:00"); difference=(dateMax.getTime() -startDate.getTime() )+(endDate.getTime()-dateMin.getTime()); } int days = (int) (difference / (1000*60*60*24)); int hours = (int) ((difference - (1000*60*60*24*days)) / (1000*60*60)); int min = (int) (difference - (1000*60*60*24*days) - (1000*60*60*hours)) / (1000*60); Log.i("log_tag","Hours: "+hours+", Mins: "+min); 

El resultado será: Horas: 9, Mins: 0

Tl dr

 ChronoUnit.HOURS.between( LocalTime.parse( "08:00:00" ) , LocalTime.parse( "13:00:00" ) ) 

5

…o…

 ChronoUnit.HOURS.between( ZonedDateTime.of( LocalDate.of( 2017 , Month.JANUARY , 23 ) , LocalTime.parse( "08:00:00" ) , ZoneId.of( "America/Montreal" ) ) , ZonedDateTime.of( LocalDate.of( 2017 , Month.JANUARY , 25 ) , LocalTime.parse( "13:00:00" ) , ZoneId.of( "America/Montreal" ) ) ) 

53

Java.time

El enfoque moderno utiliza las clases java.time.

LocalTime

La clase LocalTime representa una hora del día sin una fecha y sin una zona horaria.

 LocalTime start = LocalTime.parse( "08:00:00" ) ; LocalTime stop = LocalTime.parse( "13:00:00" ) ; 

Duration

Obtener un objeto Duration para representar el span-of-time.

 Duration d = Duration.between( start , stop ) ; 

ChronoUnit

Para el número de horas, utilice ChronoUnit .

 long hours = ChronoUnit.HOURS.between( start , stop ) ; 

Androide

Para Android, consulte los proyectos ThreeTen-Backport y ThreeTenABP. Vea las últimas viñetas a continuación.

ZonedDateTime

Si desea cruzar días, pasando de la medianoche, debe asignar fechas y zonas horarias.

Una zona horaria es crucial para determinar una fecha. Para cualquier momento dado, la fecha varía alrededor del globo por la zona. Por ejemplo, unos pocos minutos después de la medianoche en París Francia es un nuevo día, mientras que todavía "ayer" en Montreal Quebec .

Especifique un nombre de zona horaria adecuado en el formato de continent/region , como America/Montreal , Africa/Casablanca o Pacific/Auckland . Nunca utilice la abreviatura de 3-4 letras como EST o IST ya que no son zonas horarias verdaderas, no están estandarizadas y ni siquiera son únicas (!).

 ZoneId z = ZoneId.of( "America/Montreal" ) ; ZonedDateTime start = ZonedDateTime.of( LocalDate.of( 2017 , Month.JANUARY , 23 ) , LocalTime.parse( "08:00:00" ) , z ) ; ZonedDateTime stop = ZonedDateTime.of( LocalDate.of( 2017 , Month.JANUARY , 25 ) , LocalTime.parse( "13:00:00" ) , z ) ; long hours = ChronoUnit.HOURS.between( start , stop ) ; 

Vea este código en directo en IdeOne.com .

53


Acerca de java.time

El framework java.time está integrado en Java 8 y posterior. Estas clases suplantan las viejas clases de fecha-hora heredadas , como java.util.Date , Calendar y SimpleDateFormat .

El proyecto Joda-Time , ahora en modo de mantenimiento , recomienda la migración a las clases java.time .

Para obtener más información, consulte el Tutorial de Oracle . Y busca Stack Overflow para muchos ejemplos y explicaciones. La especificación es JSR 310 .

Dónde obtener las clases java.time?

  • Java SE 8 , Java SE 9 y posterior
    • Incorporado.
    • Parte de la API Java estándar con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de java.time se retroporta a Java 6 & 7 en ThreeTen-Backport .
  • Androide
    • El proyecto ThreeTenABP adapta específicamente a ThreeTen-Backport (mencionado anteriormente) para Android.
    • Consulte Cómo utilizar ThreeTenABP ….

Lo solucioné de esta manera:

 Date time1 = new SimpleDateFormat("HH:mm:ss aa").parse(string1); Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(time1); Date time2 = new SimpleDateFormat("HH:mm:ss aa").parse(string2); Calendar calendar2 = Calendar.getInstance(); calendar2.setTime(time2); if(calendar2.get(Calendar.AM_PM) == 1 && calendar1.get(Calendar.AM_PM) == 0) { calendar2.add(Calendar.DATE, 1); } long diff = calendar1.getTimeInMillis() - calendar2.getTimeInMillis() 

Esto ayudará a encontrar la diferencia en el tiempo alrededor del reloj.

 Try simple piece of code using For 24 hour time StartTime = "10:00"; EndTime = "13:00"; here starthour=10 and end hour=13 if(TextUtils.isEmpty(txtDate.getText().toString())||TextUtils.isEmpty(txtDate1.getText().toString())||TextUtils.isEmpty(txtTime.getText().toString())||TextUtils.isEmpty(txtTime1.getText().toString())) { Toast.makeText(getApplicationContext(), "Date/Time fields cannot be blank", Toast.LENGTH_SHORT).show(); } else { if (starthour > endhour) { Toast.makeText(getApplicationContext(), "Start Time Should Be Less Than End Time", Toast.LENGTH_SHORT).show(); } else if (starthour == endhour) { if (startmin > endmin) { Toast.makeText(getApplicationContext(), "Start Time Should Be Less Than End Time", Toast.LENGTH_SHORT).show(); } else{ tvalid = "True"; } } else { // Toast.makeText(getApplicationContext(),"Sucess"+(endhour-starthour)+(endmin-startmin),Toast.LENGTH_SHORT).show(); tvalid = "True"; } } same for date also 
  • SimpleDateFormat toma demasiado tiempo cuando se incluye la zona horaria
  • Conversión de cadena-fecha con nanosegundos
  • Advertencia de SimpleDateFormat Para obtener el formato local, utilice getDateInstance (), getDateTimeInstance () o getTimeInstance ()
  • Problema con el análisis Fecha cadena:
  • android obtener la fecha anterior de una fecha correspondiente (no la fecha de ayer)
  • SimpleDateFormat devuelve una fecha de 24 horas: ¿cómo obtener una fecha de 12 horas?
  • ¿Por qué este análisis de SimpleDataFormat falla en Android?
  • Android parse String hasta la fecha - carácter de patrón desconocido 'X'
  • Formato de fecha de Android con SimpleDate
  • Conversión de aaaa-mm-dd en dd mm aaaa
  • ¿Cómo puedo obtener la fecha actual en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.