calendar.getDisplayName возвращает неправильный день - PullRequest
0 голосов
/ 24 сентября 2018

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

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

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

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       

Должен возвращаться «понедельник», поскольку это текущий день.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

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.

0 голосов
/ 24 сентября 2018

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

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

08 // September Month not August
24
2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...