Neeraj Jain уже в другой ответ объяснил, почему вы получили неожиданный вывод.Я хотел бы предложить современный способ получения вашего результата.
Во-первых, ваши пользователи могут предпочесть вводить дату в одну строку в формате своей локали, например, 9/24/18
в США или 24/09/2018
по французски.Это не сложнее (если вы знаете, как):
DateTimeFormatter dateFormatter
= DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
.withLocale(Locale.getDefault(Locale.Category.FORMAT));
String dateString = in.next();
LocalDate date = LocalDate.parse(dateString, dateFormatter);
DayOfWeek dow = date.getDayOfWeek();
String dowString = dow.getDisplayName(
TextStyle.FULL_STANDALONE,
Locale.getDefault(Locale.Category.FORMAT)
);
System.out.println(dowString);
Вот пример запуска программы в США:
9/25/18
Tuesday
Если вы или ваши пользователи предпочитаете вводитьтри отдельных числа, как в вашей программе в вопросе:
Scanner in = new Scanner(System.in);
int month = in.nextInt();
int day = in.nextInt();
int year = in.nextInt();
LocalDate date = LocalDate.of(year, month, day);
Теперь у нас есть LocalDate
, остаток такой же, как и раньше.Пример прогона:
9
27
2018
Thursday
Обратите внимание, что нигде не добавляется и не вычитается 1, потому что LocalDate
нумерует месяцы так же, как люди.Я позволяю сканеру конвертировать в целые числа, я нахожу это немного проще, чем вызывать Integer.parseInt
.
Класс Calendar
, который вы использовали, давно устарел и плохо спроектирован.Я рекомендую вам забыть о проблемах с ним и вместо этого использовать LocalDate
из java.time, современного Java-API даты и времени.
Ссылка: Учебное пособие по Oracle: Дата и время объясняя, как использовать java.time
.