Неверные данные возвращены API календаря - PullRequest
0 голосов
/ 17 мая 2018

В наших бизнес-требованиях мы должны выяснить первый день недели.

Так как клиент European, поэтому я использовал следующий код, чтобы получить его.

Но,проблема в том, что когда я запускаю этот код, я получаю 2 в качестве ответа, где, как я ожидаю, 1.

public class Test{
    public static void main(String[] args) {
        TimeZone eu = TimeZone.getTimeZone("Europe/Berlin"); 
        Locale de = Locale.forLanguageTag("de"); 
        int firstDayOfWeek = Calendar.getInstance(eu, de).getFirstDayOfWeek(); 
        System.out.println(firstDayOfWeek);
    }
}

Может кто-нибудь помочь мне понять это поведение.

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Согласно javadoc , понедельник равен 2.

0 голосов
/ 17 мая 2018
    Locale de = Locale.forLanguageTag("de");
    WeekFields wf = WeekFields.of(de);
    DayOfWeek firstDayOfWeek = wf.getFirstDayOfWeek();
    System.out.println(firstDayOfWeek);

Это печатает:

ПОНЕДЕЛЬНИК

Не используйте запутанный старый Calendar класс.Вы получили 2 как первый день недели.Но разве ты не должен был получить 1?Или 0?Как нумеруются дни недели?Забудьте о числах, используйте перечисление DayOfWeek из java.time, современный Java-интерфейс даты и времени.

Для более красивого вывода используйте DayOfWeek.getDisplayName или DateTimeFormatter.Если вам нужен номер, используйте DayOfWeek.getValue:

    System.out.println(firstDayOfWeek.getDisplayName(TextStyle.FULL, de));
    System.out.println(firstDayOfWeek.getValue());

Вывод:

Montag
1

PS Также не используйте TimeZone и другие устаревшие дату и времяклассы.java.time намного приятнее работать.Этот факт хорошо показывает этот пример, но его типичное, безусловно, неслучайное.

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

0 голосов
/ 17 мая 2018

Посмотрите на документы :

Получает, какой первый день недели; Например, воскресенье в США, понедельник во Франции.

и здесь :

публичная статическая финал в понедельник 2

Это показывает, что возвращаемое значение зависит от локали.

Если мы напечатаем это:

System.out.println(firstDayOfWeek == Calendar.MONDAY);

Посмотрим true. Это означает, что первый день недели действительно понедельник. Просто вы думали, что понедельник кодируется 1. На самом деле воскресенье кодируется как 1.

...