Я выполнил следующий код, чтобы рассчитать оставшиеся оставшиеся дни. Я использовал 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));
}`
Примечание: '/ 24 * 60 * 60 * 1000' не всегда будет работать из-Daily летнее время (DST): http://en.wikipedia.org/wiki/Daylight_saving_time –
@ArnaudDenoyelle : ОК. Итак, каково будет решение этого? – gogs09