Estou tendo um problema com o método getFirstDayOfWeek() da classe calendar: Se o seu locale for pt_BR, o método retorna que é segunda feira.
O código abaixo demonstra o problema.
System.out.println("Default");
Calendar cal = Calendar.getInstance(new Locale("pt", "BR"));
System.out.println("1 - Primeiro dia da semana é domingo? " + (cal.getFirstDayOfWeek() == Calendar.SUNDAY)); // Vai dar false
System.out.println("1 - Primeiro dia da semana é segunda? " + (cal.getFirstDayOfWeek() == Calendar.MONDAY)); // Vai dar true
System.out.println("Corrigindo na mão");
cal.setFirstDayOfWeek(Calendar.SUNDAY); // Isto resolve o problema para esta instância
System.out.println("2 - Primeiro dia da semana é domingo? " + (cal.getFirstDayOfWeek() == Calendar.SUNDAY)); // Vai dar true
System.out.println("2 - Primeiro dia da semana é segunda? " + (cal.getFirstDayOfWeek() == Calendar.MONDAY)); // Vai dar false
System.out.println("Outra instância");
cal = Calendar.getInstance(new Locale("pt", "BR")); // A nova instância continua com o mesmo problema de antes
System.out.println("3 - Primeiro dia da semana é domingo? " + (cal.getFirstDayOfWeek() == Calendar.SUNDAY)); // Vai dar false
System.out.println("3 - Primeiro dia da semana é segunda? " + (cal.getFirstDayOfWeek() == Calendar.MONDAY)); // Vai dar true
Obviamente, o código acima é apenas para exemplificação.
Como pode ser visto, o calendar retorna que o primeiro dia da semana no Brasil, é segunda-feira, ao invés de domingo. O método setFirstDayOfWeek(…), não surpreendentemente, somente resolve o problema para aquela instância, e outras instâncias de Calendar que venham a ser criadas permanecerão com o mesmo problema. Se fosse só para meu código, o fato da classe retornar o dia incorreto não seria problema, mas o fato é que vários outras bibliotecas, frameworks, etc. utilizam a informação do Calendar para saber qual é o primeiro dia da semana, o que é um tanto inconveniente.
Testei este problema tanto numa VM Java 1.5 quanto numa 1.6.
Eu gostaria de saber se:
1- Há alguma razão para a máquina virtual estar achando que o primeiro dia da semana no Brasil é segunda-feira, ou é realmente um bug que se deixou passar despercebido durante vários anos?
2- Há alguma maneira de corrigir isto de forma global, isto é, fazer com que todas as classes que dependam de Calendar para saber o primeiro dia da semana recebam ‘domingo’ quando o local for pt_BR, ou seja, sem ter que sair modificando pontualmente o código em diversos lugares?
Obs: Cheguei também a olhar os fontes da API do Java, e parece que este valor incorreto é retornado pela classe sun.util.resources.LocaleData, ou seja, a VM inteira “acredita” que o primeiro dia da semana no Brasil é segunda-feira.