如何构建具有自定义第一天的Locale?

mid*_*ido 13 java android calendar

我需要一个Locale与另一个完全相同的对象,但周的第一天不同(即:周日而不是周六).

具体来说,我需要一个从周日开始的阿拉伯语 - 埃及语言环境.我正在使用仅支持更改其区域设置的日历控件,因此我的要求.

Fra*_*ani 11

Locale对象不控制一周的第一天.这是由Calendar类以下列方式完成的:

Locale locale = Locale.forLanguageTag("ar-EG");
Calendar calendar = Calendar.getInstance(locale);
calendar.setFirstDayOfWeek(Calendar.SUNDAY);
Run Code Online (Sandbox Code Playgroud)

根据对Gautam Jose的回答的评论:

通常这会很好.事实上,我正在使用的控件根据默认语言环境(应用程序范围明智)继续实例化Calendar对象,因此是自定义语言环境.我实际上尝试对控件进行逆向工程,并且由于它使用私有成员而没有提供问题的余地(即:继承它在这里无法帮助)

如果private使用Java反射API直接更改这些成员,则无需继承.

首先,检查控件的类以查找Calendar字段:

public class CalendarControl {
    private Calendar calendar;
}
Run Code Online (Sandbox Code Playgroud)

现在使用:

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
}
Run Code Online (Sandbox Code Playgroud)

  • 你击中了弗朗切斯科头上的钉子.我无法修改私人价值是迫使我首先提出问题的原因.无论出于何种原因,setAccessible都不适合我.后来,它确实有效,所以我一定做错了.这将允许我玩原始控制. (2认同)

Gau*_*ose 6

您可以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());
Run Code Online (Sandbox Code Playgroud)

  • 通常这会很好.事实上,我正在使用的控件根据默认语言环境(应用程序范围明智)继续实例化Calendar对象,因此是自定义语言环境.我实际上尝试对控件进行逆向工程,并且由于它使用私有成员而没有提供问题的余地(即:继承它在这里无法帮助) (2认同)