Ниже представлена моя программа, которая возвращает неправильное название дня, когда я ввожу соответствующий месяц, дату и год.

Что мне здесь не хватает?

Моя программа

import java.util.Calendar;
import java.util.Locale;
import java.util.Scanner;

public class TimeTest {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String month = in.next();
        String day = in.next();
        String year = in.next();

        System.out.println(getDay(day, month, year));
    }

    private static String getDay(String day, String month, String year) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day));
        return calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault());

    }
}      


< Сильный > Вывод :

09
24
2018
Wednesday       

Он должен вернуть "понедельник", так как это текущий день.

3
user10400282 24 Сен 2018 в 08:33

2 ответа

Лучший ответ

Вы передаете 09 как Месяц , предполагая, что это сентябрь , но на самом деле в классе Calendar это август , потому что месяцы начинаются с 00(Jan), 01(Feb)... и так далее в классе календаря.

Следовательно, чтобы получить правильный результат, вам необходимо передать

08 // September Month not August
24
2018

Вот ваш рабочий код

4
Neeraj Jain 24 Сен 2018 в 06:29

Нирадж Джайн уже в другом ответе уже объяснил, почему вы получили неожиданный результат. Я хотел бы внести свой вклад в современный способ получения вашего результата.

Во-первых, ваши пользователи могут предпочесть вводить дату в одну строку в формате их собственной локали, например 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, современного API даты и времени Java.

Ссылка: Обучающее руководство по Oracle: дата и время, объясняющее, как использовать java.time.

1
Basil Bourque 24 Сен 2018 в 22:18