2014-10-13 9 views
0

По какой-то причине это выводит числовое значение около 16348. Когда первое и последнее значение даты составляют 0110 и 0201 соответственно. Почему я не получаю дневную стоимость?Дни между двумя датами

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

public class Project3 { 

    public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 

    String firstDate = input.next(), lastDate = input.next(); 

    try { 
    Date date1 = new SimpleDateFormat("MMdd").parse(firstDate); 
    Date date2 = new SimpleDateFormat("MMdd").parse(lastDate); 
    System.out.println(Project3.days(date1, date2));  
    } catch (Exception e) { 
    // 
    } 

    } 
    public static long days(Date startDate, Date endDate) { 
    Calendar start = Calendar.getInstance(); 
    start.setTime(startDate); 
    Calendar end = Calendar.getInstance(); 
    long daysBetween = 0; 
    while(start.before(end)) { 
     start.add(Calendar.DAY_OF_MONTH, 1); 
     daysBetween++; 
    } 
    return daysBetween; 
} 
} 
+2

Расчет разницы между двумя датами является более чем просто вычитанием двух дат или подсчета дней, вам следует рассмотреть возможность использования одобренного API, например JodaTime или нового API времени в Java 8, например [http: // stackoverflow .com/questions/12851934/how-to-find-difference-between-two-joda-time-datetimes-in-minutes/12852021 # 12852021) – MadProgrammer

+2

Пройдя это с помощью отладчика, вы сразу сказали бы, что происходит. –

+1

Подсказка: 16348 дней/365 = 44,7 года. Как насчет реализации общих дат «около 45» лет? – user2864740

ответ

0

Т.Л., д-р

ChronoUnit.DAYS.between(
    MonthDay.parse("0110" , DateTimeFormatter.ofPattern("MMdd")).atYear(2017) , 
    MonthDay.parse("0201" , DateTimeFormatter.ofPattern("MMdd")).atYear(2017) 
) 

ISO 8601

Если возможно, изменить формат текста выполнить с Стандарт ISO 8601. Формат месяца-месяца --MM-DD, такой как --01-10 для десятого января.

MonthDay

Используйте MonthDay класс для представления в месяц-день.

MonthDay md1 = MonthDay.parse("--01-10"); 
MonthDay md2 = MonthDay.pares("--02-01"); 

Или используйте DateTimeFormatter.

MonthDay md = MonthDay.parse(
    "0110" , 
    DateTimeFormatter.ofPattern("MMdd") 
) 

LocalDate

Для расчета дней, вы должны подать заявление в год. Из-за Leap Year и 29 февраля мы не можем точно рассчитать прошедшие дни без контекста года.

LocalDate ld1 = md1.atYear(2017); 
LocalDate ld2 = md2.atYear(2017); 

ChronoUnit

Получить прошло дней с ChronoUnit.

long days = ChronoUnit.DAYS.between(ld1 , ld2); 

О java.time

java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск 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 и more.

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