Первый (и, следовательно, также последний) день недели зависит от региона (не по часовому поясу и не по смещению по Гринвичу). Локаль может определять страну или регион и / или язык. Язык не имеет отношения (по крайней мере, обычно нет), но страна это. Например, Пакистан:
WeekFields wf = WeekFields.of(Locale.forLanguageTag("ur-PK"));
System.out.println("Last day of week is " + wf.getFirstDayOfWeek().plus(6));
Вывод:
Последний день недели суббота
Или Объединенные Арабские Эмираты, поскольку вы упомянули залив (я предполагал Персидский залив):
WeekFields wf = WeekFields.of(Locale.forLanguageTag("ar-AE"));
Последний день недели пятница
Чтобы использовать локаль по умолчанию, укажите Locale.getDefault()
:
WeekFields wf = WeekFields.of(Locale.getDefault());
Так как моя локаль - Дания (Европа), сейчас я получаю Last day of week is SUNDAY
.
Я использую WeekFields
класс java.time, современный Java-интерфейс даты и времени. Используемый вами класс Calendar
плохо спроектирован и давно устарел, а современный API предлагает более богатую функциональность.
Что случилось?
Возможные объяснения наблюдаемого вами поведения:
- Ваши два устройства имеют разные настройки страны. Я считаю это вероятным объяснением. Вы не сообщили нам настройки страны для каждого устройства.
- По крайней мере на одном устройстве JVM не соответствует настройке локали устройства. Можно запустить JVM с настройкой локали, которая отличается от настройки базовой системы (не то, чтобы я знал, как это сделать на Android). Также можно динамически изменить настройку языка JVM с помощью одного из методов
Locale.setDefault
.
- Данные локали были изменены между версиями Android ваших устройств, поэтому для рассматриваемой страны одно устройство считает, что день начинается в воскресенье, а на другом устройстве - понедельник. Данные локали постоянно обновляются.
Чтобы приблизиться к этому вопросу, я бы начал с вывода Locale.getDefault().getDisplayCountry()
на каждом устройстве.
Вопрос: Могу ли я использовать java.time на Android?
Да, java.time прекрасно работает на старых и новых устройствах Android. Для этого требуется как минимум Java 6 .
- В Java 8 и более поздних версиях и на более новых устройствах Android (начиная с уровня API 26) встроен современный API.
- В Java 6 и 7 получают ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
- На более старых (Android) версиях Android используется ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Ссылки