Как я могу создать локаль с обычным первым днем недели?

Мне нужен объект Locale который точно такой же, как и другой, но с другим первым днем недели (например, воскресенье вместо субботы).

В частности, мне нужен арабско-египетский язык, который начинается в воскресенье. Я использую элемент управления календарем, который поддерживает только изменение его языка, следовательно, мое требование.

Ответ 1

Объекты Locale не контролируют первый день недели. Это выполняется классом Calendar следующим образом:

Locale locale = Locale.forLanguageTag("ar-EG");
Calendar calendar = Calendar.getInstance(locale);
calendar.setFirstDayOfWeek(Calendar.SUNDAY);

Согласно вашему комментарию на Gautam Jose ответьте:

Обычно это было бы прекрасно. Дело в том, что элемент управления, который я использую, сохраняет экземпляры объектов Calendar в соответствии с локалью по умолчанию (область приложения по умолчанию), поэтому пользовательский локаль. Я на самом деле попробовал обратное проектирование элемента управления, и он не обеспечивает свободу действий вокруг проблемы из-за этого, используя частные члены (то есть: наследование не может помочь здесь)

Вам не нужно наследовать, если вы измените эти private члены напрямую, используя API отражения Java.

Сначала осмотрите класс управления, чтобы найти поле " Calendar:

public class CalendarControl {
    private Calendar calendar;
}

Теперь используйте:

CalendarControl control; // The instance to manipulate
try {
    Field field = control.getClass().getDeclaredField("calendar");
    field.setAccessible(true);
    field.set(control, calendar); // Pass the new object we created at top of this answer
} catch (Exception ex) {
    // You must catch NoSuchFieldException and IllegalAccessException here
}

Ответ 2

Вы можете создать объект " Calendar и установить первый день, используя метод calender.setFirstDayOfWeek().

Locale locale = new Locale("ar-EG", "EG");
TimeZone timeZone = TimeZone.getTimeZone("Egypt");
Calendar calendar = GregorianCalendar.getInstance(locale);
Calendar calendar2 = GregorianCalendar.getInstance(locale);
calendar2.setFirstDayOfWeek(0);
System.out.println("Calender locale: " + locale + "\nTimeZone: "
        + timeZone.getDisplayName(locale) + "FirstDayOfTheWeek:"
        + calendar.getFirstDayOfWeek() + "\nCalender2 locale: "
        + locale + "\nTimeZone: " + timeZone.getDisplayName(locale)
        + "FirstDayOfTheWeek:" + calendar2.getFirstDayOfWeek());