2016-08-30 5 views
1

Я знаю, что здесь были заданы другие подобные вопросы, но, насколько они были опробованы, ни один из них не создал желаемый результат, например. разница между 02.09.2016 и 30.08.2016 должна составлять 3 календарных дня.Вычислить разницу между двумя датами календаря в днях

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

    int year = (int) diff/365; 
    int rest = (int) diff % 365; 
    int month = rest/30; 
    rest = rest % 30; 
    int weeks = rest/7; 
    int dayss = rest % 7; 

    long diffMillis= Math.abs(oldDate.getTime() - currentDate.getTime()); 
    long differenceInDays = TimeUnit.DAYS.convert(diffMillis, TimeUnit.MILLISECONDS); 

    Log.d("ASDafldsfg", "" + days); 
    Log.d("ASDafldsfg", "" + dayss); 
    Log.d("ASDafldsfg", "" + differenceInDays); 

и выходной сигнал выглядит следующим образом при расчете разницы между 30.08.16 и 03.09.16

D/ASDafldsfg: 3 
D/ASDafldsfg: 6 
D/ASDafldsfg: 3 
+0

Возможный дубликат [Android разницы между двумя датами] (http://stackoverflow.com/questions/21285161/android-difference-between-two-dates) – user392117

ответ

1

просто литье двойной плавать, а затем применяя Math.ceil() констатировала проблема,

long diff = oldDate.getTime() - currentDate.getTime(); float days = (float) diff/1000/60/60/24; tv_days.setText(String.valueOf((int) Math.ceil(days)));

2

Попробуйте это:

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

} 

Выход:

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 
1

Joda-Time обеспечивает качественную замену Java дата и время классов. Конструкция позволяет использовать несколько систем календарей, а еще обеспечивает простой API.

Его просты в обращении с датой и временем.

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

Joda Demo

+0

какой тип объекта " начать "и" конец "? @Sohail Zahid – Nilabja

+0

его Дата вы можете увидеть демонстрационное приложение –

+0

Я изо всех сил старался получить работу по дате JAVA - пока я, наконец, не сдался и не переключился на JODA - все благодаря этому однострочному вам, @SohailZahid. –

1

JDK 1.8 введен LocalDate и это сделало жизнь намного проще для людей ... Вы можете использовать его, чтобы вычислить разницу между двумя датами, как:

классов, используемых:

import java.time.Month; 
import java.time.LocalDate; 
import java.time.temporal.ChronoUnit; 

LocalDate dateBefore=LocalDate.of(2016,09,02); // you can also use Month.SEPTEMBER 
LocalDate dateAfter=LocalDate.of(30,08,2016); //you can also use Month.AUGUST 
long daysBetween = DAYS.between(dateBefore, dateAfter); // this is the chronounit for Days :) 

новое время АФИ extremeley мощный, пожалуйста, используйте его для удобства

Поскольку андроид не поддерживает все JDK 1.8 функции, выше, не будет полезно использовать следующие вместо

date1 and date2 are normal Date objects obtained using calendar object initialized to your date and then Calendar.getTime() 

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

Как получить «ChronoUnit» с помощью jdk 1.8.0_60 в студии android 2.1.3 – Nilabja

+0

извините мой отредактированный ответ ... забыл, что андроид глупо теперь поддерживает lambdas, но не время api ... – Kushan

Смежные вопросы