2015-07-12 13 views
13

Ho bisogno di un oggetto Locale che sia esattamente uguale a un altro ma con un diverso primo giorno della settimana (es .: domenica anziché sabato).Come posso creare un locale con un primo giorno della settimana personalizzato?

In particolare, ho bisogno di un locale arabo-egiziano che inizi di domenica. Sto usando un controllo del calendario che supporta solo la modifica delle impostazioni internazionali, quindi il mio requisito.

risposta

11

Locale oggetti non controllano il primo giorno della settimana. Questo viene fatto dalla classe Calendar nel modo seguente:

Secondo your comment sulla risposta di Gautam Jose:

Normalmente questo sarebbe stato bene. Il controllo che sto utilizzando continua a creare un'istanza degli oggetti del Calendario in base alle impostazioni internazionali predefinite (ambito applicativo saggio), quindi una locale personalizzata. Ho effettivamente provato il controllo inverso del controllo e non fornisce margine di manovra intorno al problema a causa dell'utilizzo di membri privati ​​(ad esempio: l'ereditarietà non può essere d'aiuto)

Non è necessario ereditare se si modificano questi private membri direttamente utilizzando l'API di riflessione Java.

In primo luogo, ispezionare classe del controllo per trovare il campo Calendar:

public class CalendarControl { 
    private Calendar calendar; 
} 

Ora usare:

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

Hai centrato l'unghia sulla testa di Francesco. La mia incapacità di modificare i valori privati ​​è stato ciò che mi ha costretto a porre la domanda in primo luogo. Per qualsiasi motivo setAccessible non ha funzionato per me un po '. Più tardi, ha funzionato, quindi devo aver fatto qualcosa di sbagliato. Questo ora mi permetterà di giocare con il controllo originale. – mido

6

È possibile creare un oggetto Calendar e impostare il primo giorno utilizzando il metodo 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()); 
+2

Normalmente questo Sarebbe stato bene. Il controllo che sto utilizzando continua a creare un'istanza degli oggetti del Calendario in base alle impostazioni internazionali predefinite (ambito applicativo saggio), quindi una locale personalizzata. In realtà ho provato a decodificare il controllo e non fornisce margine di manovra intorno al problema a causa dell'utilizzo di membri privati ​​(ad esempio l'ereditarietà non può essere d'aiuto) – mido

Problemi correlati