Дни Android между двумя датами

Я хочу сравнить две даты для своего приложения для Android, но у меня очень странная проблема.

Например:

Если я back in the past дату до 127 дней назад:

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

А затем сравните его с текущей датой (между днями)

  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; 

Он вернет 22, что совсем не то, что ожидалось.

Я сделал что-то неправильно или это проблема с classом Calendar ?

Пожалуйста, обратитесь к этому коду, это может вам помочь.

 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"); } 

Вот двухстрочное решение:

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

В этом примере он получает количество дней между датой «testCalendar» и текущей датой.

Я наконец нашел самый простой способ справиться с этим. Вот мой код:

 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; } 

Надеюсь, поможет.

  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)); 

лучший путь :-

  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); } 

У меня была такая же потребность, я, наконец, закончил использование Joda Time, это очень удобно и предлагает множество дополнительных функций, включая тот, который вы ищете.

Вы можете скачать файлы здесь .

После того, как вы включили файл jar в свой проект, вы можете легко выполнить, например, следующее:

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

Лучшее решение, которое сработало для меня:

 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)); } 

Поскольку он сначала преобразует Hour , Minute , Second и Millisecond в 0 и теперь разница будет только в днях.

Вы никогда не должны использовать формулу, такую ​​как 24 * 60 * 60 * 1000! Зачем? Потому что есть дневная экономия времени, и не все дни имеют 24 часа, а также о високосном году, который имеет +1 день. Вот почему есть class календаря. Если вы не хотите размещать внешнюю библиотеку в своем проекте, например Jodatime, вы можете использовать class pure Calendar с очень эффективной функцией:

 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; } 

Сделайте так, чтобы он поддерживал все уровни 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(); } 

это стандартный и лучший способ:

 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(); } 
Давайте будем гением компьютера.