Выдача календарных выходных дней - PullRequest
2 голосов
/ 30 мая 2019

Я получаю экземпляр календаря

Calendar.getInstance()

На одном мобильном телефоне суббота отображается как выходные дни, а на другом - воскресенье как выходные. Часовой пояс обоих устройств одинаков

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

Я хочу, чтобы выходные дни на обоих устройствах были одинаковыми, если часовой пояс одинаковый

Ответы [ 3 ]

2 голосов
/ 30 мая 2019

Первый (и, следовательно, также последний) день недели зависит от региона (не по часовому поясу и не по смещению по Гринвичу). Локаль может определять страну или регион и / или язык. Язык не имеет отношения (по крайней мере, обычно нет), но страна это. Например, Пакистан:

    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 с подпакетами.

Ссылки

1 голос
/ 30 мая 2019

Вы можете попробовать что-то вроде.

Calendar sundayFirst = Calendar.getInstance();
sundayFirst.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
0 голосов
/ 30 мая 2019

Вы можете попробовать это

Calendar.getInstance().setFirstDayOfWeek(Calendar.SUNDAY);
...