2015-02-10 5 views
1

Я выполнил следующий код, чтобы рассчитать оставшиеся оставшиеся дни. Я использовал SimpleDateFormat для преобразования строки на дату. Если я введу 10/02/1993 (сегодняшняя дата) в качестве даты, на выходе будет оставлено 0 дней. Но если я выберу 11/02/1993, он будет показывать тот же результат, что и 0 дней. Но если я изменю месяц, то есть 22/07/1993, он показывает 160 дней, оставшихся вместо 162 дней, что является исходным результатом. Что я здесь делаю неправильно? Любая помощь приветствуется.Расчет оставшихся дней в java

private static void calculateNextBirthday() { 
     Scanner in = new Scanner(System.in); 
     System.out.println("Enter your birthday(dd/MM/yyyy)"); 
     user_input = in.nextLine(); 

     SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 

     Calendar user_selected_day = new GregorianCalendar(); 

     Calendar today = new GregorianCalendar(); 

     Date selected_date = null; 
     try { 
      selected_date = formatter.parse(user_input); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

     user_selected_day.setTime(selected_date); 

     int user_selected_month = user_selected_day.get(Calendar.MONTH); 
     int CMonth = today.get(Calendar.MONTH); 

     int user_selected_date = user_selected_day.get(Calendar.DAY_OF_MONTH); 
     int CDate = today.get(Calendar.DAY_OF_MONTH); 

     user_selected_day.set(Calendar.YEAR, today.get(Calendar.YEAR)); 

     user_selected_day.set(Calendar.DAY_OF_WEEK,today.get(Calendar.DAY_OF_WEEK)); 

     if (user_selected_month < CMonth) { 
      user_selected_day.set(Calendar.YEAR,today.get(Calendar.YEAR) + 1); 
     } 
     else if (user_selected_month == CMonth){ 
      if(user_selected_date < CDate){ 
       user_selected_day.set(Calendar.YEAR,today.get(Calendar.YEAR) + 1); 
      } 
     } 

     long millis = user_selected_day.getTimeInMillis() - today.getTimeInMillis(); 
     long days; 
     days = (millis/(24 * 60 * 60 * 1000)); 

     System.out.println(String.valueOf(days) + " days left!!"); 
    } 

UPDATE: Я обновил код ниже, и она отлично работает. Надеюсь, это поможет кому-то в будущем.

`  SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 

     Calendar user_selected_day = new GregorianCalendar(); 

     Calendar today = new GregorianCalendar(); 

     Date selected_date = null; 

     try { 
      selected_date = formatter.parse(plainDate); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

     user_selected_day.setTime(selected_date); 

     int user_selected_month = user_selected_day.get(Calendar.MONTH); 
     int CMonth = today.get(Calendar.MONTH); 

     int user_selected_date = user_selected_day.get(Calendar.DAY_OF_MONTH); 
     int CDate = today.get(Calendar.DAY_OF_MONTH); 

     user_selected_day.set(Calendar.YEAR, today.get(Calendar.YEAR)); 

     user_selected_day.set(Calendar.HOUR_OF_DAY,today.get(Calendar.HOUR_OF_DAY)); 
     user_selected_day.set(Calendar.MINUTE,today.get(Calendar.MINUTE)); 
     user_selected_day.set(Calendar.SECOND,today.get(Calendar.SECOND)); 
     user_selected_day.set(Calendar.MILLISECOND,today.get(Calendar.MILLISECOND)); 


     if (user_selected_month < CMonth) { 
      user_selected_day.set(Calendar.YEAR,today.get(Calendar.YEAR) + 1); 
     } 
     else if (user_selected_month == CMonth){ 
      if(user_selected_date < CDate){ 
       user_selected_day.set(Calendar.YEAR,today.get(Calendar.YEAR) + 1); 
      } 

     } 

     long millis = user_selected_day.getTimeInMillis() - today.getTimeInMillis(); 
     long days; 
     if(user_selected_day.getTime()==today.getTime()){ 
      days = 0; 
     } 
     else{ 
      days = (millis/(24 * 60 * 60 * 1000)); 
     }` 
+1

Примечание: '/ 24 * 60 * 60 * 1000' не всегда будет работать из-Daily летнее время (DST): http://en.wikipedia.org/wiki/Daylight_saving_time –

+0

@ArnaudDenoyelle : ОК. Итак, каково будет решение этого? – gogs09

ответ

1

Проблема заключается в линиях

user_selected_day.set(Calendar.YEAR, today.get(Calendar.YEAR)); 

Это позволит установить год сегодняшнего дня до user_selected день и в месяц равно будет идти внутри ElseIf и выйти из той же без внесения каких-либо изменений ,

Также проверьте состояние If else, о котором вы упоминали.

0

Не сделать расчет самостоятельно. Когда у вас есть объекты Calendar, используйте метод «add», чтобы увеличить требуемое значение.

1

Вы также можете использовать класс LocalDate в Java 8, чтобы добавлять/вычитать даты на ходу.

java.time предлагает Period класс для представления промежутка времени, например, количество дней или часов и минут. LocalDate и друзья предлагают plus() и minus() методы для добавления или вычитания периода или другого связанного с временем объекта. Период предлагает заводские методы, такие как ofDays().

этот пример для справки. Он вычисляет, что дата будет 700 дней с этого момента:

/** 
* DateAdd -- compute the difference between two dates (e.g., today and 700 days 
* from now). 
*/ 
public class Main { 
    public static void main(String[] av) { 
     /** Today's date */ 
     LocalDate now = LocalDate.now(); 
     Period p = Period.ofDays(700); 
     LocalDate then = now.plus(p); 
     System.out.printf("Seven hundred days from %s is %s%n", now, then); 
    } 
} 

Запуск этой программы сообщает текущую дату и время, и то, что дата и время будет семьсот дней с этого момента. Например:

Seven hundred days from 2013-11-09 is 2015-10-10 
Смежные вопросы