Android / Java - різниця в датах у днях


80

Я отримую поточну дату (у форматі 31.12.1999, тобто мм / дд / рррр), використовуючи код нижче:

Textview txtViewData;
txtViewDate.setText("Today is " +
        android.text.format.DateFormat.getDateFormat(this).format(new Date()));

і у мене інша дата у форматі: 2010-08-25 (тобто рррр / мм / дд),

тож я хочу знайти різницю між датою у кількості днів, як знайти різницю у днях?

(Іншими словами, я хочу знайти різницю між ПОТОЧНОЮ ДАТОЮ - рррр / мм / дд відформатованої дати )


Цей код використовує неприємні старі класи часу та часу, замінені тепер класами java.time. Щодо старих Java та Android, див. Проекти ThreeTen-Backport та ThreeTenABP .
Василь Бурк

Подібне запитання, але з використанням моментів, а не цілих дат: різниця в
Basil Bourque

Відповіді:


126

Не дуже надійний метод, краще використовувати JodaTime

  Calendar thatDay = Calendar.getInstance();
  thatDay.set(Calendar.DAY_OF_MONTH,25);
  thatDay.set(Calendar.MONTH,7); // 0-11 so 1 less
  thatDay.set(Calendar.YEAR, 1985);

  Calendar today = Calendar.getInstance();

  long diff = today.getTimeInMillis() - thatDay.getTimeInMillis(); //result in millis

Ось наближення ...

long days = diff / (24 * 60 * 60 * 1000);

Щоб проаналізувати дату з рядка, ви можете використовувати

  String strThatDay = "1985/08/25";
  SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
  Date d = null;
  try {
   d = formatter.parse(strThatDay);//catch exception
  } catch (ParseException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } 


  Calendar thatDay = Calendar.getInstance();
  thatDay.setTime(d); //rest is the same....

Хоча, оскільки ви впевнені у форматі дати ... Ви також можете зробити Integer.parseInt()на цьому підрядку, щоб отримати їх числові значення.


@stOle дякую, але у мене обидві дати в рядках, так як я це можу зробити, будь ласка, дайте мені знати докладно, PLS
Paresh Mayani

1
@stOle не отримує точної відповіді, можливо, це невелика помилка у вашому коді, я отримую 274 дні розриву, навіть якщо встановив String strThatDay = "2010/10/03" ;, це має бути лише 1 день, подяка для підтримки
Paresh Mayani

@Paresh, вибачте, це ("yyyy/mm/dd");слід замінити на ("yyyy/MM/dd");" Велика М" на місяць, мала літера - на хвилини. Виправлено.
st0le

1
@Gevorg, я це рекомендував. :) Me Gusta JodaTime
st0le

3
Іноді цей код буде вихідним через проблеми із округленням (їх відсутність) при діленні мілісекунд. Це працює для мене:Math.round(millisBetweenDates * 1f / TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS));
Ciske Boekelo

83

Це НЕ моя робота, знайшов відповідь тут . не хотів непрацюючого посилання в майбутньому :).

Ключовим є цей рядок для врахування налаштування денного світла, посилання Повний код.

TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));

або спробуйте передати в TimeZone якості параметра daysBetween()і виклику setTimeZone()в sDateі eDateоб'єктах.

Отже:

public static Calendar getDatePart(Date date){
    Calendar cal = Calendar.getInstance();       // get calendar instance
    cal.setTime(date);      
    cal.set(Calendar.HOUR_OF_DAY, 0);            // set hour to midnight
    cal.set(Calendar.MINUTE, 0);                 // set minute in hour
    cal.set(Calendar.SECOND, 0);                 // set second in minute
    cal.set(Calendar.MILLISECOND, 0);            // set millisecond in second
    
    return cal;                                  // return the date part
}

getDatePart () взято звідси

/**
 * This method also assumes endDate >= startDate
**/
public static long daysBetween(Date startDate, Date endDate) {
  Calendar sDate = getDatePart(startDate);
  Calendar eDate = getDatePart(endDate);

  long daysBetween = 0;
  while (sDate.before(eDate)) {
      sDate.add(Calendar.DAY_OF_MONTH, 1);
      daysBetween++;
  }
  return daysBetween;
}

Нюанси: знайти різницю між двома датами не так просто, як відняти дві дати і поділити результат на (24 * 60 * 60 * 1000). Фактично, це помилково!

Наприклад: Різниця між двома датами 24.03.2007 та 25.03.2007 повинна становити 1 день; Однак, використовуючи наведений вище спосіб, у Великобританії ви отримаєте 0 днів!

Переконайтесь самі (код нижче). Поїздка в мілісекундах призведе до округлення помилок, і вони стануть найбільш очевидними, коли у вас з’явиться така річ, як літній час.

Повний код:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class DateTest {

public class DateTest {

static SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");

public static void main(String[] args) {

  TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));

  //diff between these 2 dates should be 1
  Date d1 = new Date("01/01/2007 12:00:00");
  Date d2 = new Date("01/02/2007 12:00:00");

  //diff between these 2 dates should be 1
  Date d3 = new Date("03/24/2007 12:00:00");
  Date d4 = new Date("03/25/2007 12:00:00");

  Calendar cal1 = Calendar.getInstance();cal1.setTime(d1);
  Calendar cal2 = Calendar.getInstance();cal2.setTime(d2);
  Calendar cal3 = Calendar.getInstance();cal3.setTime(d3);
  Calendar cal4 = Calendar.getInstance();cal4.setTime(d4);

  printOutput("Manual   ", d1, d2, calculateDays(d1, d2));
  printOutput("Calendar ", d1, d2, daysBetween(cal1, cal2));
  System.out.println("---");
  printOutput("Manual   ", d3, d4, calculateDays(d3, d4));
  printOutput("Calendar ", d3, d4, daysBetween(cal3, cal4));
}


private static void printOutput(String type, Date d1, Date d2, long result) {
  System.out.println(type+ "- Days between: " + sdf.format(d1)
                    + " and " + sdf.format(d2) + " is: " + result);
}

/** Manual Method - YIELDS INCORRECT RESULTS - DO NOT USE**/
/* This method is used to find the no of days between the given dates */
public static long calculateDays(Date dateEarly, Date dateLater) {
  return (dateLater.getTime() - dateEarly.getTime()) / (24 * 60 * 60 * 1000);
}

/** Using Calendar - THE CORRECT WAY**/
public static long daysBetween(Date startDate, Date endDate) {
  ...
}

ВИХІД:

Посібник - Дні між: 01 січня 2007 року та 02 січня 2007 року: 1

Календар - Дні між: 01 січня 2007 року та 02 січня 2007 року: 1


Посібник - Дні між: 24 березня 2007 року та 25 березня 2007 року: 0

Календар - Дні між: 24 березня 2007 року та 25 березня 2007 року: 1


Погодьтеся. Використовуючи методи вищого рівня Ви отримуєте більш надійні та елегантні рішення. Дякую!
Роджер Еліен

Для методу: daysBut Between якщо дата - 15:00 24 липня 2012 року і endDate - 16:00 24 липня 2012 року - тоді дата передує endDate, ОДИН не на цілий день, а лише на одну годину. Мені чогось не вистачає, чи результат із daysBet Between буде помилковим для цього випадку (оскільки очікуваний результат дорівнює нулю, але при наведеному обчисленні має привести 1, а не нуль)?
AgentKnopf

@Zainodis, Чи надмірно я оновлював код? Я думаю, це повинно вирішити проблему.
Самуель

@SamQuest Дякуємо за оновлення! Я застосував більш наївний підхід: цикл while із sDate.before (eDate) зупиняється, а результат повертається, якщо початок і кінець в один день, місяць та рік. це також гарантує, що якщо в першій ітерації початок і кінець знаходяться в один день / місяць / рік (незважаючи на початок часу перед початком), нуль буде правильно повернуто.
AgentKnopf

Ви, сер, заслуговуєте на дзвони!
marienke

38

Більшість відповідей були хорошими та правильними для вашої проблеми

тож я хочу знайти різницю між датою у кількості днів, як знайти різницю у днях?

Я пропоную цей дуже простий і зрозумілий підхід, який гарантовано дасть вам правильну різницю в будь-якому часовому поясі:

int difference= 
((int)((startDate.getTime()/(24*60*60*1000))
-(int)(endDate.getTime()/(24*60*60*1000))));

І це все!


Це теж спрацювало для мене .. Інші були занадто складними і настільки точними :)
Сіддхарт

1
Було б краще, якщо ви відняли спочатку і розділили пізніше, щоб запобігти діленню двічі.
ravindu1024,

@ ravindu1024 Це робить різницю в +1, якщо початкова дата менша за кінцеву. У цьому випадку є різниця +1. Можна вирішити, додавши до відповіді -1.
sHOLE

@sHOLE як? Я кажу, що ви повинні робити (t1-t2) / C замість t1 / C - t2 / C. Оскільки ні t1 / C, ні t2 / C не будуть дорівнювати нулю, я не можу зрозуміти, як це вплине на відповідь.
ravindu1024

@ ravindu1024 Я зрозумів, що ви намагаєтесь сказати, і здивувався тому ж, коли прочитав цю відповідь. Лише після впровадження я помітив, чому це не було зроблено таким чином (причина, про яку я згадав вище).
sHOLE

25

Використовуйте jodatime API

Days.daysBetween(start.toDateMidnight() , end.toDateMidnight() ).getDays() 

де 'start' і 'end' - це ваші об'єкти DateTime . Для синтаксичного аналізу рядків дати на об'єкти DateTime використовуйте метод parseDateTime

Існує також спеціальна для Android бібліотека JodaTime .


3
дякую за підтримку, але не радий використовувати інший API, якщо це зроблено за допомогою коду Android / JAVA
Paresh Mayani

2
+1 для Джоди. API календаря Java - це жахливий хаос, а Joda - чиста і гарна.
LuxuryMode

JodaTime видає кілька помилок з декількома пристроями в Android, я не знаю чому, у мене є кілька проблем з цим
josemwarrior

1
Бібліотека часу Joda додасть 4744 методів до вашого проекту. Вибирайте з розумом, якщо хочете уникнути обмеження в 65 000 методів.
Lior Iluz

14

Цей фрагмент враховує перехід на літній час і становить O (1).

private final static long MILLISECS_PER_DAY = 24 * 60 * 60 * 1000;

private static long getDateToLong(Date date) {
    return Date.UTC(date.getYear(), date.getMonth(), date.getDate(), 0, 0, 0);
}

public static int getSignedDiffInDays(Date beginDate, Date endDate) {
    long beginMS = getDateToLong(beginDate);
    long endMS = getDateToLong(endDate);
    long diff = (endMS - beginMS) / (MILLISECS_PER_DAY);
    return (int)diff;
}

public static int getUnsignedDiffInDays(Date beginDate, Date endDate) {
    return Math.abs(getSignedDiffInDays(beginDate, endDate));
}

6

Це простий і найкращий розрахунок для мене, і, можливо, для вас.

       try {
            /// String CurrDate=  "10/6/2013";
            /// String PrvvDate=  "10/7/2013";
            Date date1 = null;
            Date date2 = null;
            SimpleDateFormat df = new SimpleDateFormat("M/dd/yyyy");
            date1 = df.parse(CurrDate);
            date2 = df.parse(PrvvDate);
            long diff = Math.abs(date1.getTime() - date2.getTime());
            long diffDays = diff / (24 * 60 * 60 * 1000);


            System.out.println(diffDays);

        } catch (Exception e1) {
            System.out.println("exception " + e1);
        }

@PareshMayani просто перевіряє журнал кота
Rishi Gautam

3

Відповідь Correct Wayвід Sam Quest працює лише в тому випадку, якщо перша дата раніше другої. Більше того, він поверне 1, якщо дві дати знаходяться протягом одного дня.

Це рішення, яке мені найбільше вдалося. Як і більшість інших рішень, воно все одно буде показувати неправильні результати протягом двох днів у році через неправильне зміщення світлового дня.

private final static long MILLISECS_PER_DAY = 24 * 60 * 60 * 1000;

long calculateDeltaInDays(Calendar a, Calendar b) {

    // Optional: avoid cloning objects if it is the same day
    if(a.get(Calendar.ERA) == b.get(Calendar.ERA) 
            && a.get(Calendar.YEAR) == b.get(Calendar.YEAR)
            && a.get(Calendar.DAY_OF_YEAR) == b.get(Calendar.DAY_OF_YEAR)) {
        return 0;
    }
    Calendar a2 = (Calendar) a.clone();
    Calendar b2 = (Calendar) b.clone();
    a2.set(Calendar.HOUR_OF_DAY, 0);
    a2.set(Calendar.MINUTE, 0);
    a2.set(Calendar.SECOND, 0);
    a2.set(Calendar.MILLISECOND, 0);
    b2.set(Calendar.HOUR_OF_DAY, 0);
    b2.set(Calendar.MINUTE, 0);
    b2.set(Calendar.SECOND, 0);
    b2.set(Calendar.MILLISECOND, 0);
    long diff = a2.getTimeInMillis() - b2.getTimeInMillis();
    long days = diff / MILLISECS_PER_DAY;
    return Math.abs(days);
}

3

найкращий і найпростіший спосіб зробити це

  public int getDays(String begin) throws ParseException {
     long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
     SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH);

    long begin = dateFormat.parse(begin).getTime();
    long end = new Date().getTime(); // 2nd date want to compare
    long diff = (end - begin) / (MILLIS_PER_DAY);
    return (int) diff;
}

3

tl; д-р

ChronoUnit.DAYS.between( 
    LocalDate.parse( "1999-12-28" ) , 
    LocalDate.parse( "12/31/1999" , DateTimeFormatter.ofPattern( "MM/dd/yyyy" ) ) 
)

Деталі

Інші відповіді застарілі. Старі класи дати та часу, що входять до складу найдавніших версій Java, виявились погано розробленими, заплутаними та клопіткими. Уникайте їх.

java.time

Проект Joda-Time був дуже успішним як заміна старих класів. Ці заняття дали натхнення для java.time фреймворка вбудованого в Java 8 і пізніших версій.

Значна частина функцій java.time переноситься назад на Java 6 і 7 у ThreeTen-Backport і надалі адаптується до Android у ThreeTenABP .

LocalDate

LocalDateКлас являє собою дату тільки значення без часу доби і без часового поясу.

Розбір рядків

Якщо ваші вхідні рядки мають стандартний формат ISO 8601 , LocalDateклас може безпосередньо проаналізувати рядок.

LocalDate start = LocalDate.parse( "1999-12-28" );

Якщо не у форматі ISO 8601, визначте шаблон форматування за допомогою DateTimeFormatter.

String input = "12/31/1999";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "MM/dd/yyyy" );
LocalDate stop = LocalDate.parse( input , formatter );

Минулі дні через ChronoUnit

Тепер отримайте кількість днів, що минули між цією парою LocalDateоб’єктів. У ChronoUnitперерахування обчислюють час , що минув.

long totalDays = ChronoUnit.DAYS.between( start , stop ) ; 

Якщо ви не знайомі з переліченнями Java, знайте, вони набагато потужніші та корисніші, ніж звичайні перерахування в більшості інших мов програмування. Щоб дізнатись більше, перегляньте Enumдокумент класу, підручник Oracle та Вікіпедію .


Про java.time

Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date, Calendar, і SimpleDateFormat.

Проект Joda-Time , який зараз перебуває в режимі обслуговування , радить перейти на класи java.time .

Щоб дізнатись більше, див. Підручник Oracle . І шукайте в Stack Overflow багато прикладів та пояснень. Специфікація - JSR 310 .

Де отримати класи java.time?

  • Java SE 8 і SE 9 і пізніших версій
    • Вбудований.
    • Частина стандартного Java API із комплексною реалізацією.
    • Java 9 додає деякі незначні функції та виправлення.
  • Java SE 6 і SE 7
    • Значна частина функцій java.time переноситься назад на Java 6 і 7 у ThreeTen-Backport .
  • Android

Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є полігоном для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval, YearWeek, YearQuarter, і більш .


java.time.LocalDate не підтримується в Android
Mahdi Astanei

1
@MahdiAstanei Перечитайте мій третій абзац про бібліотеку ThreeTenABP для Android. Варто додати у свій додаток, оскільки старі класи часу та часу справді такі погані.
Василь Бурк

2

Використовуйте такі функції:

   /**
     * Returns the number of days between two dates. The time part of the
     * days is ignored in this calculation, so 2007-01-01 13:00 and 2007-01-02 05:00
     * have one day inbetween.
     */
    public static long daysBetween(Date firstDate, Date secondDate) {
        // We only use the date part of the given dates
        long firstSeconds = truncateToDate(firstDate).getTime()/1000;
        long secondSeconds = truncateToDate(secondDate).getTime()/1000;
        // Just taking the difference of the millis.
        // These will not be exactly multiples of 24*60*60, since there
        // might be daylight saving time somewhere inbetween. However, we can
        // say that by adding a half day and rounding down afterwards, we always
        // get the full days.
        long difference = secondSeconds-firstSeconds;
        // Adding half a day
        if( difference >= 0 ) {
            difference += SECONDS_PER_DAY/2; // plus half a day in seconds
        } else {
            difference -= SECONDS_PER_DAY/2; // minus half a day in seconds
        }
        // Rounding down to days
        difference /= SECONDS_PER_DAY;

        return difference;
    }

    /**
     * Truncates a date to the date part alone.
     */
    @SuppressWarnings("deprecation")
    public static Date truncateToDate(Date d) {
        if( d instanceof java.sql.Date ) {
            return d; // java.sql.Date is already truncated to date. And raises an
                      // Exception if we try to set hours, minutes or seconds.
        }
        d = (Date)d.clone();
        d.setHours(0);
        d.setMinutes(0);
        d.setSeconds(0);
        d.setTime(((d.getTime()/1000)*1000));
        return d;
    }

2

Є просте рішення, яке, принаймні для мене, є єдиним можливим рішенням.

Проблема полягає в тому, що всі відповіді, які я бачу підкидаючи - за допомогою Joda, або календаря, або дати, або чого завгодно - беруть до уваги лише кількість мілісекунд. У підсумку вони підраховують кількість 24-годинних циклів між двома датами , а не фактичну кількість днів . Тож щось із 1 січня 23:00 до 02 січня 1:00 повернеться через 0 днів.

Щоб порахувати фактичну кількість днів між startDateі endDate, просто виконайте:

// Find the sequential day from a date, essentially resetting time to start of the day
long startDay = startDate.getTime() / 1000 / 60 / 60 / 24;
long endDay = endDate.getTime() / 1000 / 60 / 60 / 24;

// Find the difference, duh
long daysBetween = endDay - startDay;

Це поверне "1" між 2 січня та 1 січня. Якщо вам потрібно підрахувати кінцевий день, просто додайте 1 до daysBetween(мені це потрібно було зробити в моєму коді, оскільки я хотів порахувати загальну кількість днів у діапазоні).

Це дещо схоже на те, що запропонував Даніель, але, на мою думку, менший код.


2

Всі ці рішення страждають від однієї з двох проблем. Або рішення не є абсолютно точним через помилки округлення, високосні дні та секунди тощо, або ви в кінцевому підсумку зациклюєтесь на кількості днів між двома невідомими датами.

Це рішення вирішує першу проблему та покращує другу приблизно в 365 разів, краще, якщо ви знаєте, який ваш максимальний діапазон.

/**
 * @param thisDate
 * @param thatDate
 * @param maxDays
 *            set to -1 to not set a max
 * @returns number of days covered between thisDate and thatDate, inclusive, i.e., counting both
 *          thisDate and thatDate as an entire day. Will short out if the number of days exceeds
 *          or meets maxDays
 */
public static int daysCoveredByDates(Date thisDate, Date thatDate, int maxDays) {
    //Check inputs
    if (thisDate == null || thatDate == null) {
        return -1;
    }

    //Set calendar objects
    Calendar startCal = Calendar.getInstance();
    Calendar endCal = Calendar.getInstance();
    if (thisDate.before(thatDate)) {
        startCal.setTime(thisDate);
        endCal.setTime(thatDate);
    }
    else {
        startCal.setTime(thatDate);
        endCal.setTime(thisDate);
    }

    //Get years and dates of our times.
    int startYear = startCal.get(Calendar.YEAR);
    int endYear = endCal.get(Calendar.YEAR);
    int startDay = startCal.get(Calendar.DAY_OF_YEAR);
    int endDay = endCal.get(Calendar.DAY_OF_YEAR);

    //Calculate the number of days between dates.  Add up each year going by until we catch up to endDate.
    while (startYear < endYear && maxDays >= 0 && endDay - startDay + 1 < maxDays) {
        endDay += startCal.getActualMaximum(Calendar.DAY_OF_YEAR); //adds the number of days in the year startDate is currently in
        ++startYear;
        startCal.set(Calendar.YEAR, startYear); //reup the year
    }
    int days = endDay - startDay + 1;

    //Honor the maximum, if set
    if (maxDays >= 0) {
        days = Math.min(days, maxDays);
    }
    return days;
}

Якщо вам потрібні дні між датами (не включаючи останню дату), просто позбудьтеся, + 1коли побачите endDay - startDay + 1.


1

Інший спосіб:

public static int numberOfDaysBetweenDates(Calendar fromDay, Calendar toDay) {
        fromDay = calendarStartOfDay(fromDay);
        toDay = calendarStartOfDay(toDay);
        long from = fromDay.getTimeInMillis();
        long to = toDay.getTimeInMillis();
        return (int) TimeUnit.MILLISECONDS.toDays(to - from);
    }

дайте коментар щодо коду, який ви надали. щоб люди розуміли значення вашого коду.
Абед Путра,

1

використовувати ці функції

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

Цей код використовує неприємні старі класи часу та часу, замінені тепер класами java.time. Щодо старих Java та Android, див. Проекти ThreeTen-Backport та ThreeTenABP .
Василь Бурк

Клас календаря - це старі класи часу та дати?
neal zedlav

Так, будь-який клас, пов’язаний із датою та часом, знайдений поза java.timeпакетом, є застарілим і його слід уникати. Сюди входять Dateі Calendar, і класи java.sql. Див. Підручник Oracle.
Basil Bourque

1
        public void dateDifferenceExample() {

        // Set the date for both of the calendar instance
        GregorianCalendar calDate = new GregorianCalendar(2012, 10, 02,5,23,43);
        GregorianCalendar cal2 = new GregorianCalendar(2015, 04, 02);

        // Get the represented date in milliseconds
        long millis1 = calDate.getTimeInMillis();
        long millis2 = cal2.getTimeInMillis();

        // Calculate difference in milliseconds
        long diff = millis2 - millis1;

        // Calculate difference in seconds
        long diffSeconds = diff / 1000;

        // Calculate difference in minutes
        long diffMinutes = diff / (60 * 1000);

        // Calculate difference in hours
        long diffHours = diff / (60 * 60 * 1000);

        // Calculate difference in days
        long diffDays = diff / (24 * 60 * 60 * 1000);
    Toast.makeText(getContext(), ""+diffSeconds, Toast.LENGTH_SHORT).show();


}

0

Я знайшов дуже простий спосіб зробити це, і це те, що я використовую в своєму додатку.

Скажімо, у вас є дати в об’єктах Time (або що завгодно, нам потрібні лише мілісекунди):

Time date1 = initializeDate1(); //get the date from somewhere
Time date2 = initializeDate2(); //get the date from somewhere

long millis1 = date1.toMillis(true);
long millis2 = date2.toMillis(true);

long difference = millis2 - millis1 ;

//now get the days from the difference and that's it
long days = TimeUnit.MILLISECONDS.toDays(difference);

//now you can do something like
if(days == 7)
{
    //do whatever when there's a week of difference
}

if(days >= 30)
{
    //do whatever when it's been a month or more
}

0

Joda-Time

Найкращий спосіб - використовувати Joda-Time , надзвичайно успішну бібліотеку з відкритим кодом, яку ви додали б до свого проекту.

String date1 = "2015-11-11";
String date2 = "2013-11-11";
DateTimeFormatter formatter = new DateTimeFormat.forPattern("yyyy-MM-dd");
DateTime d1 = formatter.parseDateTime(date1);
DateTime d2 = formatter.parseDateTime(date2);
long diffInMillis = d2.getMillis() - d1.getMillis();

Duration duration = new Duration(d1, d2);
int days = duration.getStandardDays();
int hours = duration.getStandardHours();
int minutes = duration.getStandardMinutes();

Якщо ви використовуєте Android Studio , дуже просто додати joda-time. У вашому build.gradle (додаток):

dependencies {
  compile 'joda-time:joda-time:2.4'
  compile 'joda-time:joda-time:2.4'
  compile 'joda-time:joda-time:2.2'
}

Хороша відповідь. Зверніть увагу , що виклик toStringна Durationпороджує уявлення рядки в одному з ISO 8601 стандартних форматів PnYnMnDTnHnMnS . В Pвідзначає початок, в той час як Tвідокремлює рік-місяць-дні з вартовими хвилин-секунд. Так P3Dтри дні, і P3DT12Hце три з половиною дні.
Basil Bourque

2
Бібліотека часу Joda додасть 4744 методів до вашого проекту. Вибирайте з розумом, якщо хочете уникнути обмеження в 65 000 методів.
Ліор Ілуз,

Це потрібно змінити на DateTimeFormatter formatter = DateTimeFormat.forPattern ("рррр-ММ-дд")
sb_269

0
        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));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.