Календарь Android getFirstDayOfWeek bug

Я хочу получить первый день недели, но у меня странная ошибка. Если я использую этот код:

Calendar cal = Calendar.getInstance();
cal.set(2017, 0, 1);

cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL, Locale.getDefault());
Log.d(TAG, "Date: " + dateFormat.format(cal.getTime()));

Мой журнал отображает неправильную дату: D/Activity: Date: lundi 2 janvier 2017

Но если я использую getTime() метод просто так:

Calendar cal = Calendar.getInstance();
cal.set(2017, 0, 1);
cal.getTime(); // Here

cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL, Locale.getDefault());
Log.d(TAG, "Date: " + dateFormat.format(cal.getTime()));

Мой журнал отображает правильную дату: D/Activity: Date: lundi 26 décembre 2016

Мой телефон использует французский язык, поэтому моя неделя начинается в понедельник.

Кто-нибудь знает почему?

1 ответ

Решение

API Календаря Java печально известен своим поведением относительно обновления полей. Проблема в том, что несколько set() вызовы могут привести к неожиданному результату, потому что некоторые внутренние компоненты не корректируются должным образом, то есть он не обновляет некоторые значения до тех пор, пока это действительно не требуется, например, когда вы вызываете getTime(),

Вы можете прочитать больше об этом посте.

Таким образом, решение этой проблемы действительно стоит назвать getTime() или же getTimeInMillis() между.

Другие вопросы по тегам