Вопрос по java, android, date – Как я могу получить разницу между двумя датами в Android ?, пробовал каждую вещь и пост

21

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

Вот что я делаю:

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

и я получаю: дата 1 января 1970 года, а время всегда больше через два часа ... Я из Израиля, так что два часа пора.

Как я могу получить нормальную разницу ???

Подобный вопрос:date difference in days, in Android Basil Bourque
Этот код использует проблемные старые классы даты и времени, которые теперь вытесняются классами java.time. Для более старых версий Java и Android см.ThreeTen-Backport а такжеThreeTenABP проекты. Basil Bourque

Ваш Ответ

7   ответов
2

java.time.Duration:

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

Это напечатает что-то вроде

PT109H27M21S

Это означает период времени 109 часов 27 минут 21 секунда. Если вы хотите что-то более читаемое человеком & # x2014; Сначала я приведу 9-ю версию, это самое простое:

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

Теперь мы получаем

4 days 13 hours 27 minutes 21 seconds

Duration класс является частьюjava.time современный API даты и времени Java. Это в комплекте на новых устройствах Android. На старых устройствах получите ThreeTenABP, добавьте его в свой проект и убедитесь, что вы импортировалиorg.threeten.bp.Duration и другие классы даты и времени, которые могут вам понадобиться из того же пакета.

Предполагая, что вы до сих пор не получили версию Java 9, вы можете вычесть более крупные единицы по очереди, чтобы получить меньшие:

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

Затем вы можете отформатировать четыре переменные, как указано выше.

What did you do wrong?

Date представляет собой момент времени. Он никогда не предназначался для представления количества времени, продолжительности и не подходит для этого. Попытка сделать эту работу будетat best привести к запутанному и трудно поддерживаемому коду. Вы этого не хотите, поэтому, пожалуйста, не делайте этого.

Links Oracle tutorial: Date Time, explaining how to use java.time. ThreeTen Backport project, the backport of java.time to Java 6 and 7 ThreeTenABP, Android edition of ThreeTen Backport Question: How to use ThreeTenABP in Android Project, with a very thorough explanation. Java Specification Request (JSR) 310.
19
    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);
-1

который работает для меня. отправьте дату начала и окончания в миллисекундах.

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

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


}
GregorianCalendar это ужасный класс, который был вытеснен несколько лет назадjava.time классы, в частностиZonedDateTime, Предполагать, что старый класс в 2019 году - плохой совет. Для более ранней версии Android см.ThreeTen-Backport а такжеThreeTenABP проекты.
13

Some addition:

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();
    }
Из вашего метода я вычитаю две даты, текущую дату и 10-дневную дату, она возвращает отрицательные миллисекунды. при использовании обоих текущих дней разность дат в часах возвращает положительные миллисекунды. Зачем?
Лучшее решение :)
69

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

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

Вся эта математика будет просто выполнять целочисленную арифметику, поэтому она усекает любые десятичные точки

@DanF потрясающий ..
Это время, а не дата, какую дату вы пытаетесь создать?
Могу ли я создать объект Date из этой информации? Alex Kapustian
0

    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 проекты.
Да, любой класс, связанный с датой и временем, найденный внеjava.time пакет сейчас унаследован и его следует избегать. Это включаетDate а такжеCalendarи классы java.sql. Смотрите руководство по Oracle.
Класс календаря - старые классы даты и времени?

Похожие вопросы