¿Cómo obtengo la diferencia entre dos fechas en Android ?, intenté cada cosa y publiqué

Vi toda la publicación aquí y todavía no puedo entender cómo obtener la diferencia entre dos fechas de Android.

Esto es lo que hago:

long diff = date1.getTime() - date2.getTime(); Date diffDate = new Date(diff); 

y entiendo: la fecha es el 1 de enero de 1970 y el tiempo siempre es más grande en dos horas … Soy de Israel, así que las dos horas son timeOffset.

¿Cómo puedo obtener una diferencia normal?

Está cerca de la respuesta correcta, está obteniendo la diferencia en milisegundos entre esas dos fechas, pero cuando intenta construir una fecha a partir de esa diferencia, supone que desea crear un nuevo objeto Date con ese valor de diferencia como su época era Si estás buscando un tiempo en horas, entonces simplemente necesitarías hacer una aritmética básica en esa diff para obtener las diferentes partes de tiempo:

 long diff = date1.getTime() - date2.getTime(); long seconds = diff / 1000; long minutes = seconds / 60; long hours = minutes / 60; long days = hours / 24; 

Todas estas matemáticas simplemente harán una aritmética entera, por lo que truncarán los puntos decimales

  long diffInMillisec = date1.getTime() - date2.getTime(); long diffInDays = TimeUnit.MILLISECONDS.toDays(diffInMillisec); long diffInHours = TimeUnit.MILLISECONDS.toHours(diffInMillisec); long diffInMin = TimeUnit.MILLISECONDS.toMinutes(diffInMillisec); long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffInMillisec); 

Algunas adiciones: Aquí convierto cadena a fecha y luego comparo la hora actual.

 String toyBornTime = "2014-06-18 12:56:50"; SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); try { Date oldDate = dateFormat.parse(toyBornTime); System.out.println(oldDate); Date currentDate = new Date(); long diff = currentDate.getTime() - oldDate.getTime(); long seconds = diff / 1000; long minutes = seconds / 60; long hours = minutes / 60; long days = hours / 24; if (oldDate.before(currentDate)) { Log.e("oldDate", "is previous date"); Log.e("Difference: ", " seconds: " + seconds + " minutes: " + minutes + " hours: " + hours + " days: " + days); } // Log.e("toyBornTime", "" + toyBornTime); } catch (ParseException e) { e.printStackTrace(); } 

Use java.time.Duration :

  Duration diff = Duration.between(instant2, instant1); System.out.println(diff); 

Esto imprimirá algo así como

 PT109H27M21S 

Esto significa un período de tiempo de 109 horas, 27 minutos y 21 segundos. Si quieres algo más legible por humanos, primero daré la versión 9, es más simple:

  String formattedDiff = String.format(Locale.ENGLISH, "%d days %d hours %d minutes %d seconds", diff.toDays(), diff.toHoursPart(), diff.toMinutesPart(), diff.toSecondsPart()); System.out.println(formattedDiff); 

Ahora obtenemos

 4 days 13 hours 27 minutes 21 seconds 

La clase Duration es parte de java.time la java.time moderna de fecha y hora de Java. Esto se incluye en los dispositivos Android más nuevos. En dispositivos más antiguos, obtén ThreeTenABP y agrégalo a tu proyecto, y asegúrate de importar org.threeten.bp.Duration y otras clases de fecha y hora que puedas necesitar del mismo paquete.

Suponiendo que todavía no tiene la versión de Java 9, puede restar las unidades más grandes para obtener las más pequeñas:

  long days = diff.toDays(); diff = diff.minusDays(days); long hours = diff.toHours(); diff = diff.minusHours(hours); long minutes = diff.toMinutes(); diff = diff.minusMinutes(minutes); long seconds = diff.toSeconds(); 

Luego puede formatear las cuatro variables como se indicó anteriormente.

¿Qué hiciste mal?

Una Date representa un punto en el tiempo. Nunca fue diseñado para representar una cantidad de tiempo, una duración y no es adecuado para eso. Intentar hacer ese trabajo llevaría, en el mejor de los casos , a un código confuso y difícil de mantener. No quieres eso, así que por favor no lo hagas.

Campo de golf

  • Tutorial de Oracle: Fecha y hora , explicando cómo usar java.time .
  • El proyecto ThreeTen Backport , el backport de java.time para Java 6 y 7
  • ThreeTenABP , edición Android de ThreeTen Backport
  • Pregunta: Cómo usar ThreeTenABP en Android Project , con una explicación muy completa.
  • Solicitud de especificación de Java (JSR) 310 .

Use estas funciones

  public static int getDateDifference( int previousYear, int previousMonthOfYear, int previousDayOfMonth, int nextYear, int nextMonthOfYear, int nextDayOfMonth, int differenceToCount){ // int differenceToCount = can be any of the following // Calendar.MILLISECOND; // Calendar.SECOND; // Calendar.MINUTE; // Calendar.HOUR; // Calendar.DAY_OF_MONTH; // Calendar.MONTH; // Calendar.YEAR; // Calendar.---- Calendar previousDate = Calendar.getInstance(); previousDate.set(Calendar.DAY_OF_MONTH, previousDayOfMonth); // month is zero indexed so month should be minus 1 previousDate.set(Calendar.MONTH, previousMonthOfYear); previousDate.set(Calendar.YEAR, previousYear); Calendar nextDate = Calendar.getInstance(); nextDate.set(Calendar.DAY_OF_MONTH, previousDayOfMonth); // month is zero indexed so month should be minus 1 nextDate.set(Calendar.MONTH, previousMonthOfYear); nextDate.set(Calendar.YEAR, previousYear); return getDateDifference(previousDate,nextDate,differenceToCount); } public static int getDateDifference(Calendar previousDate,Calendar nextDate,int differenceToCount){ // int differenceToCount = can be any of the following // Calendar.MILLISECOND; // Calendar.SECOND; // Calendar.MINUTE; // Calendar.HOUR; // Calendar.DAY_OF_MONTH; // Calendar.MONTH; // Calendar.YEAR; // Calendar.---- //raise an exception if previous is greater than nextdate. if(previousDate.compareTo(nextDate)>0){ throw new RuntimeException("Previous Date is later than Nextdate"); } int difference=0; while(previousDate.compareTo(nextDate)<=0){ difference++; previousDate.add(differenceToCount,1); } return difference; } 

la respuesta más corta que funciona para mí. envía la fecha de inicio y finalización en milisegundos.

 public int GetDifference(long start,long end){ Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(start); int hour = cal.get(Calendar.HOUR_OF_DAY); int min = cal.get(Calendar.MINUTE); long t=(23-hour)*3600000+(59-min)*60000; t=start+t; int diff=0; if(end>t){ diff=(int)((end-t)/ TimeUnit.DAYS.toMillis(1))+1; } return diff; }