Diferencia de Android entre dos fechas

Tengo dos citas como:

String date_1="yyyyMMddHHmmss"; String date_2="yyyyMMddHHmmss"; 

Quiero imprimir la diferencia como:

 2d 3h 45m 

¿Cómo puedo hacer eso? ¡Gracias!

 DateTimeUtils obj = new DateTimeUtils(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/M/yyyy hh:mm:ss"); try { Date date1 = simpleDateFormat.parse("10/10/2013 11:30:10"); Date date2 = simpleDateFormat.parse("13/10/2013 20:35:55"); obj.printDifference(date1, date2); } catch (ParseException e) { e.printStackTrace(); } //1 minute = 60 seconds //1 hour = 60 x 60 = 3600 //1 day = 3600 x 24 = 86400 public void printDifference(Date startDate, Date endDate) { //milliseconds long different = endDate.getTime() - startDate.getTime(); System.out.println("startDate : " + startDate); System.out.println("endDate : "+ endDate); System.out.println("different : " + different); long secondsInMilli = 1000; long minutesInMilli = secondsInMilli * 60; long hoursInMilli = minutesInMilli * 60; long daysInMilli = hoursInMilli * 24; long elapsedDays = different / daysInMilli; different = different % daysInMilli; long elapsedHours = different / hoursInMilli; different = different % hoursInMilli; long elapsedMinutes = different / minutesInMilli; different = different % minutesInMilli; long elapsedSeconds = different / secondsInMilli; System.out.printf( "%d days, %d hours, %d minutes, %d seconds%n", elapsedDays, elapsedHours, elapsedMinutes, elapsedSeconds); } 

out put es:

 startDate : Thu Oct 10 11:30:10 SGT 2013 endDate : Sun Oct 13 20:35:55 SGT 2013 different : 291945000 3 days, 9 hours, 5 minutes, 45 seconds 

Esto funciona y convierte a String como una bonificación;)

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { //Dates to compare String CurrentDate= "09/24/2015"; String FinalDate= "09/26/2015"; Date date1; Date date2; SimpleDateFormat dates = new SimpleDateFormat("MM/dd/yyyy"); //Setting dates date1 = dates.parse(CurrentDate); date2 = dates.parse(FinalDate); //Comparing dates long difference = Math.abs(date1.getTime() - date2.getTime()); long differenceDates = difference / (24 * 60 * 60 * 1000); //Convert long to String String dayDifference = Long.toString(differenceDates); Log.e("HERE","HERE: " + dayDifference); } catch (Exception exception) { Log.e("DIDN'T WORK", "exception " + exception); } } 

Te dará la diferencia en meses

 long milliSeconds1 = calendar1.getTimeInMillis(); long milliSeconds2 = calendar2.getTimeInMillis(); long periodSeconds = (milliSeconds2 - milliSeconds1) / 1000; long elapsedDays = periodSeconds / 60 / 60 / 24; System.out.println(String.format("%d months", elapsedDays/30)); 
 Date userDob = new SimpleDateFormat("yyyy-MM-dd").parse(dob); Date today = new Date(); long diff = today.getTime() - userDob.getTime(); int numOfDays = (int) (diff / (1000 * 60 * 60 * 24)); int hours = (int) (diff / (1000 * 60 * 60)); int minutes = (int) (diff / (1000 * 60)); int seconds = (int) (diff / (1000)); 
 DateTime start = new DateTime(2013, 10, 20, 5, 0, 0, Locale); DateTime end = new DateTime(2013, 10, 21, 13, 0, 0, Locale); Days.daysBetween(start.toLocalDate(), end.toLocalDate()).getDays() 

devuelve cuántos días entre dos fechas dadas, donde DateTime es de la biblioteca joda

Corto y dulce:

 /** * Get a diff between two dates * * @param oldDate the old date * @param newDate the new date * @return the diff value, in the days */ public static long getDateDiff(SimpleDateFormat format, String oldDate, String newDate) { try { return TimeUnit.DAYS.convert(format.parse(newDate).getTime() - format.parse(oldDate).getTime(), TimeUnit.MILLISECONDS); } catch (Exception e) { e.printStackTrace(); return 0; } } 

Uso:

 int dateDifference = (int) getDateDiff(new SimpleDateFormat("dd/MM/yyyy"), "29/05/2017", "31/05/2017"); System.out.println("dateDifference: " + dateDifference); 

Salida:

 dateDifference: 2 

Puede calcular la diferencia de tiempo en milisegundos utilizando este método y obtener las salidas en segundos, minutos, horas, días, meses y años.

Puede descargar clases desde aquí: DateTimeDifference GitHub Link

  • Fácil de usar
  long currentTime = System.currentTimeMillis ();
 long previousTime = (System.currentTimeMillis () - 864000000);  //Hace 10 dias

 Log.d ("DateTime:", "Diferencia con la segunda:" + AppUtility.DateTimeDifference (currentTime, previousTime, AppUtility.TimeDifference.SECOND));
 Log.d ("DateTime:", "Diferencia con el minuto:" + AppUtility.DateTimeDifference (currentTime, previousTime, AppUtility.TimeDifference.MINUTE)); 
  • Puedes comparar el ejemplo a continuación
  if (AppUtility.DateTimeDifference (currentTime, previousTime, AppUtility.TimeDifference.MINUTE)> 100) {
     Log.d ("DateTime:", "Hay más de 100 minutos de diferencia entre dos fechas");
 }más{
     Log.d ("DateTime:", "No hay más de 100 minutos de diferencia entre dos fechas");
 } 

Cuando use Date() para calcular la diferencia en horas, es necesario configurar SimpleDateFormat() en UTC; de lo contrario, obtendrá un error de una hora debido a Daylight SavingTime.

Uso esto: envíe 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; } 

Puede generalizar esto en una función que le permite elegir el formato de salida

 private String substractDates(Date date1, Date date2, SimpleDateFormat format) { long restDatesinMillis = date1.getTime()-date2.getTime(); Date restdate = new Date(restDatesinMillis); return format.format(restdate); } 

Ahora es una llamada a función simple como esta, diferencia en horas, minutos y segundos:

 SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Date date1 = formater.parse(dateEnd); Date date2 = formater.parse(dateInit); String result = substractDates(date1, date2, new SimpleDateFormat("HH:mm:ss")); txtTime.setText(result); } catch (ParseException e) { e.printStackTrace(); } 

Aquí está la respuesta moderna. Es bueno para cualquiera que utilice Java 8 o posterior (que ya no funciona para la mayoría de los teléfonos con Android) o que esté contento con una biblioteca externa.

  String date1 = "20170717141000"; String date2 = "20170719175500"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); Duration diff = Duration.between(LocalDateTime.parse(date1, formatter), LocalDateTime.parse(date2, formatter)); if (diff.isZero()) { System.out.println("0m"); } else { long days = diff.toDays(); if (days != 0) { System.out.print("" + days + "d "); diff = diff.minusDays(days); } long hours = diff.toHours(); if (hours != 0) { System.out.print("" + hours + "h "); diff = diff.minusHours(hours); } long minutes = diff.toMinutes(); if (minutes != 0) { System.out.print("" + minutes + "m "); diff = diff.minusMinutes(minutes); } long seconds = diff.getSeconds(); if (seconds != 0) { System.out.print("" + seconds + "s "); } System.out.println(); } 

Esto imprime

 2d 3h 45m 

En mi opinión, la ventaja no es tanto que sea más corta (no es mucho), pero dejar los cálculos en una biblioteca estándar es menos propenso a errores y proporciona un código más claro. Estas son grandes ventajas. El lector no tiene la carga de reconocer constantes como 24, 60 y 1000 y verificar que se usan correctamente.

Estoy usando la API moderna de fecha y hora de Java (descrita en JSR-310 y también conocida bajo este nombre). Para usar esto en Android, obtenga ThreeTenABP, vea esta pregunta: Cómo usar ThreeTenABP en Android Project . Para usarlo con otras Java 6 o 7, obtenga ThreeTen Backport . Con Java 8 y posterior está incorporado.

Con Java 9 será un poco más fácil ya que la clase Duration se amplía con métodos para darle la parte de días, partes de horas, partes de minutos y partes de segundos por separado para que no necesite las restas. Vea un ejemplo en mi respuesta aquí .