2014-11-20 4 views
1

Извините, я пытался ввести код для даты Months и Days, оставаясь, к сожалению, я получаю неправильный результат. Любая помощь будет оценена. Благодаря!Как получить месяцы и дни между двумя датами

SimpleDateFormat formatter= new SimpleDateFormat("dd-MM-yyyy"); 
String sdate = "08-02-2016"; 
String edate  = "02-02-2017"; 

Date startdate = formatter.parse(sdate); 
Date enddate = formatter.parse(eddate); 

Calendar startCalendar = new GregorianCalendar(); 
startCalendar.setTime(startdate); 

Calendar endCalendar = new GregorianCalendar(); 
endCalendar.setTime(enddate); 

int diffYear = endCalendar.get(Calendar.YEAR) - startCalendar.get(Calendar.YEAR); //effdate - currdate 
int diffMonth = diffYear * 12 + endCalendar.get(Calendar.MONTH) -startCalendar.get(Calendar.MONTH); 
int diffDay= endCalendar.get(Calendar.DAY_OF_MONTH) -startCalendar.get(Calendar.DAY_OF_MONTH); 

Ожидаемый результат: 11 месяцев, 25 дней

P/s: JodaTime не применяется.

+3

Вы используете Java 8? Никогда не стоит пытаться рассчитать разницу между датами путем вычитания, она не учитывает особенности даты/времени, поэтому JodaTime существует ... – MadProgrammer

+0

Все, что вам нужно, это дополнительная логика для рассмотрения дела где день CURDATE меньше, чем день EFFDATE. Какая часть этого вызывает у вас трудности? –

+1

Да, как говорит MadProgrammer, это просто в Java 8 - вы используете 'Period.between (...)', передавая пару объектов LocalDate. Итак, у вас есть Java 8? –

ответ

1

Я бы настоятельно рекомендуем вам использовать надежные API для надежного результата, но если вы настаиваете делать это вручную, попробуйте с нижеследующим, кажется, дает правильный результат (по крайней мере, для теста) :

SimpleDateFormat formatter= new SimpleDateFormat("dd-MM-yyyy"); 
    String CURRDATE = "08-02-2016"; 
    String EFFDATE  = "02-02-2017"; 

    Date startdate = formatter.parse(CURRDATE); 
    Date enddate = formatter.parse(EFFDATE); 

    Calendar startCalendar = new GregorianCalendar(); 
    startCalendar.setTime(startdate); 

    Calendar endCalendar = new GregorianCalendar(); 
    endCalendar.setTime(enddate); 

    int monthCount = 0; 
    int firstDayInFirstMonth = startCalendar.get(Calendar.DAY_OF_MONTH); 
    startCalendar.set(Calendar.DAY_OF_MONTH, 1); 
    endCalendar.add(Calendar.DAY_OF_YEAR, -firstDayInFirstMonth+1); 

    while (!startCalendar.after(endCalendar)) {  
     startCalendar.add(Calendar.MONTH, 1); 
     ++monthCount; 
    } 

    startCalendar.add(Calendar.MONTH, -1); --monthCount; 
    int remainingDays = 0; 
    while (!startCalendar.after(endCalendar)) { 
     startCalendar.add(Calendar.DAY_OF_YEAR, 1); 
     ++remainingDays; 
    } 

    startCalendar.add(Calendar.DAY_OF_YEAR, -1); 
    --remainingDays; 

    int lastMonthMaxDays = endCalendar.getActualMaximum(Calendar.DAY_OF_MONTH); 
    if (remainingDays >= lastMonthMaxDays) { 
     ++monthCount; 
     remainingDays -= lastMonthMaxDays; 
    } 

    int diffMonth = monthCount; 
    int diffDay = remainingDays; 

    System.out.println("diffMonth==="+diffMonth +" Month(s) and " + diffDay + " Day(s)"); 
+0

Спасибо, @Mooolo, он работает. – user3835327

0

я думаю, прямо и не может получить как г день у ч х мин

но вы можете получить отдельный день мин сек и все, как показано ниже -

long diff = EFFDAT.getTime() - CURRDATE.getTime(); 
    long diffSeconds = diff/1000 % 60; 
    long diffMinutes = diff/(60 * 1000) % 60; 
    long diffHours = diff/(60 * 60 * 1000); 
    int diffInDays = (int) ((dt2.getTime() - dt1.getTime())/(1000 * 60 * 60 * 24)); 

ОБНОВЛЕНО

надеюсь, что это может помочь - я думаю, вам нужна Java 8

LocalDate today = LocalDate.now(); 
LocalDate birthday = LocalDate.of(1960, Month.JANUARY, 1); 

Period p = Period.between(birthday, today); 
long p2 = ChronoUnit.DAYS.between(birthday, today); 

System.out.println("You are " + p.getYears() + " years, " + p.getMonths() + " months, and " + p.getDays() + " days old. (" + p2 + " days total)"); 

reference Oracle Page

+0

Нет! Не все дни - 24 часа. Это происходит примерно в 25% случаев - то есть, когда диапазон дат заканчивается в летнее время и начинается зимой. Вы также не ответили на вопрос о получении месяцев и дней. –

+0

ваше обновление очень полезно спасибо – mboullouz