Días de Android entre dos fechas

Quiero comparar dos fechas para mi aplicación Android, pero tengo un problema realmente extraño.

Por ejemplo:

Si configuro el back in the past fecha back in the past a hace 127 días:

 this.dateEvent = System.currentTimeMillis() - (127 * 24 * 3600 * 1000) 

Y luego compararlo con la fecha actual (Días entre)

  Calendar sDate = getDatePart(new Date(this.dateEvent)); Calendar eDate = getDatePart(new Date(System.currentTimeMillis())); int daysBetween = 0; while (sDate.before(eDate)) { sDate.add(Calendar.DAY_OF_MONTH, 1); daysBetween ++; } while (sDate.after(eDate)) { eDate.add(Calendar.DAY_OF_MONTH, 1); daysBetween ++; } return daysBetween; 

Devolverá 22, que no es en absoluto lo que se esperaba.

¿Hice algo mal o es un problema con la clase Calendar ?

Por favor, consulte este código, esto puede ayudarlo.

 public String getCountOfDays(String createdDateString, String expireDateString) { SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault()); Date createdConvertedDate = null, expireCovertedDate = null, todayWithZeroTime = null; try { createdConvertedDate = dateFormat.parse(createdDateString); expireCovertedDate = dateFormat.parse(expireDateString); Date today = new Date(); todayWithZeroTime = dateFormat.parse(dateFormat.format(today)); } catch (ParseException e) { e.printStackTrace(); } int cYear = 0, cMonth = 0, cDay = 0; if (createdConvertedDate.after(todayWithZeroTime)) { Calendar cCal = Calendar.getInstance(); cCal.setTime(createdConvertedDate); cYear = cCal.get(Calendar.YEAR); cMonth = cCal.get(Calendar.MONTH); cDay = cCal.get(Calendar.DAY_OF_MONTH); } else { Calendar cCal = Calendar.getInstance(); cCal.setTime(todayWithZeroTime); cYear = cCal.get(Calendar.YEAR); cMonth = cCal.get(Calendar.MONTH); cDay = cCal.get(Calendar.DAY_OF_MONTH); } /*Calendar todayCal = Calendar.getInstance(); int todayYear = todayCal.get(Calendar.YEAR); int today = todayCal.get(Calendar.MONTH); int todayDay = todayCal.get(Calendar.DAY_OF_MONTH); */ Calendar eCal = Calendar.getInstance(); eCal.setTime(expireCovertedDate); int eYear = eCal.get(Calendar.YEAR); int eMonth = eCal.get(Calendar.MONTH); int eDay = eCal.get(Calendar.DAY_OF_MONTH); Calendar date1 = Calendar.getInstance(); Calendar date2 = Calendar.getInstance(); date1.clear(); date1.set(cYear, cMonth, cDay); date2.clear(); date2.set(eYear, eMonth, eDay); long diff = date2.getTimeInMillis() - date1.getTimeInMillis(); float dayCount = (float) diff / (24 * 60 * 60 * 1000); return ("" + (int) dayCount + " Days"); } 

Aquí hay una solución de dos líneas:

 long msDiff = Calendar.getInstance().getTimeInMillis() - testCalendar.getTimeInMillis(); long daysDiff = TimeUnit.MILLISECONDS.toDays(msDiff); 

En este ejemplo, obtiene el número de días entre la fecha “testCalendar” y la fecha actual.

Finalmente encontré la manera más fácil de lidiar con eso. Aquí está mi código:

 public int getTimeRemaining() { Calendar sDate = toCalendar(this.dateEvent); Calendar eDate = toCalendar(System.currentTimeMillis()); // Get the represented date in milliseconds long milis1 = sDate.getTimeInMillis(); long milis2 = eDate.getTimeInMillis(); // Calculate difference in milliseconds long diff = Math.abs(milis2 - milis1); return (int)(diff / (24 * 60 * 60 * 1000)); } private Calendar toCalendar(long timestamp) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(timestamp); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar; } 

Espero eso ayude.

  Date userDob = new SimpleDateFormat("yyyy-MM-dd").parse(dob); Date today = new Date(); long diff = today.getTime() - userDob.getTime(); int numOfYear = (int) ((diff / (1000 * 60 * 60 * 24))/365); 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)); 

la mejor manera :-

  long fromCalender = Calender.getInstance(); fromCalender.set...// set the from dates long toCalender = Calender.getInstance(); fromCalender.set...// set the to dates long diffmili = fromCalender - toCalender; long hours = TimeUnit.MILLISECONDS.toHours(diffmili); long days = TimeUnit.MILLISECONDS.toDays(diffmili); long min = TimeUnit.MILLISECONDS.toMinutes(diffmili); long sec = TimeUnit.MILLISECONDS.toSeconds(diffmili); 
 public long Daybetween(String date1,String date2,String pattern) { SimpleDateFormat sdf = new SimpleDateFormat(pattern,Locale.ENGLISH); Date Date1 = null,Date2 = null; try{ Date1 = sdf.parse(date1); Date2 = sdf.parse(date2); }catch(Exception e) { e.printStackTrace(); } return (Date2.getTime() - Date1.getTime())/(24*60*60*1000); } 

Tuve la misma necesidad, finalmente terminé usando Joda Time, es muy conveniente y ofrece muchas funciones adicionales, incluida la que está buscando.

Puede descargar los archivos desde aquí .

Una vez que haya incluido el archivo jar en su proyecto, puede hacer fácilmente, por ejemplo, lo siguiente:

 int daysBetween = Days.daysBetween(new DateTime(sDate), new DateTime(eDate)).getDays(); 

La mejor solución que funcionó para mí es:

 private static int findDaysDiff(long unixStartTime,long unixEndTime) { Calendar calendar1 = Calendar.getInstance(); calendar1.setTimeInMillis(unixStartTime); calendar1.set(Calendar.HOUR_OF_DAY, 0); calendar1.set(Calendar.MINUTE, 0); calendar1.set(Calendar.SECOND, 0); calendar1.set(Calendar.MILLISECOND, 0); Calendar calendar2 = Calendar.getInstance(); calendar2.setTimeInMillis(unixEndTime); calendar2.set(Calendar.HOUR_OF_DAY, 0); calendar2.set(Calendar.MINUTE, 0); calendar2.set(Calendar.SECOND, 0); calendar2.set(Calendar.MILLISECOND, 0); return (int) ((calendar2.getTimeInMillis()-calendar1.getTimeInMillis())/(24 * 60 * 60 * 1000)); } 

Ya que primero convierte Hour , Minute , Second y Millisecond a 0 y ahora la diferencia será solo en días.

¡Nunca uses una fórmula como 24 * 60 * 60 * 1000! ¿Por qué? Debido a que hay un horario de ahorro diurno, y no todos los días tienen 24 horas, también qué pasa con el año bisiesto, que tiene +1 día. Es por eso que hay una clase de calendario. Si no desea colocar una biblioteca externa en su proyecto como Jodatime, podría usar la clase de calendario puro con una función muy eficiente:

 public static int numDaysBetween(final Calendar c, final long fromTime, final long toTime) { int result = 0; if (toTime < = fromTime) return result; c.setTimeInMillis(toTime); final int toYear = c.get(Calendar.YEAR); result += c.get(Calendar.DAY_OF_YEAR); c.setTimeInMillis(fromTime); result -= c.get(Calendar.DAY_OF_YEAR); while (c.get(Calendar.YEAR) < toYear) { result += c.getActualMaximum(Calendar.DAY_OF_YEAR); c.add(Calendar.YEAR, 1); } return result; } 

Hazlo así, es compatible con todos los niveles de Api

  Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("MMM dd yyyy HH:mm:ss", Locale.ENGLISH); try { String datestart="June 14 2018 16:02:37"; cal.setTime(sdf.parse(datestart));// all done Calendar cal1=Calendar.getInstance(); String formatted = sdf.format(cal1.getTime());//formatted date as i want cal1.setTime(sdf.parse(formatted));// all done long msDiff = cal1.getTimeInMillis() - cal.getTimeInMillis(); long daysDiff = TimeUnit.MILLISECONDS.toDays(msDiff); Toast.makeText(this, "days="+daysDiff, Toast.LENGTH_SHORT).show(); } catch (ParseException e) { e.printStackTrace(); } 

esto es estándar y la mejor manera:

 SimpleDateFormat myFormat = new SimpleDateFormat("dd/MM/yyyy"); try { java.util.Date date1 = myFormat.parse(date1); //for example 1/1/2017 java.util.Date date2 = myFormat.parse(date2); //for example 5/1/2017 long diff = date2.getTime() - date1.getTime(); System.out.println ("Days: " + TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS)); // Days : 5 } catch (ParseException e) { e.printStackTrace(); }