Bug no getFirstDayOfWeek() da classe Calendar?

7 respostas
H

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.

7 Respostas

edmarr

o seu problema esta nesta linda vc nao esta passando o locale correto .

Calendar cal = Calendar.getInstance();

Assim ele funciona perfeitamente que ele ira pegar o default da VM .

B

Como diz no próprio JavaDoc: Gets what the first day of the week is; e.g., SUNDAY in the U.S., MONDAY in France.
Agora também fiquei intrigado, será que eles acham que aqui no Brasil o primeiro dia da semana é segunda-feira, igual na França?

edmarr

bKn:
Como diz no próprio JavaDoc: Gets what the first day of the week is; e.g., SUNDAY in the U.S., MONDAY in France.
Agora também fiquei intrigado, será que eles acham que aqui no Brasil o primeiro dia da semana é segunda-feira, igual na França?

Ta ai uma Boa pergunta .

E

Rodando o programa abaixo, você vê que realmente o pessoal da Sun acha que a gente vive na Europa e fala espanhol.

O pessoal da Eslováquia pediu para corrigirem isso:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6497154

Que tal pedirem para corrigir isso?

import java.util.*;

class GetFirstDayOfWeek {
    public static void main(String[] args) {
        Map<Integer, String> m = new HashMap<Integer, String>();
        m.put (Calendar.SUNDAY, "Domingo");
        m.put (Calendar.MONDAY, "Segunda-feira");
        m.put (Calendar.TUESDAY, "Terca-feira");
        m.put (Calendar.WEDNESDAY, "Quarta-feira");
        m.put (Calendar.THURSDAY, "Quinta-feira");
        m.put (Calendar.FRIDAY, "Sexta-feira");
        m.put (Calendar.SATURDAY, "Sabado");
        Calendar cal;
        ArrayList<Locale> locales = new ArrayList<Locale>(Arrays.asList (Locale.getAvailableLocales()));
        Collections.sort (locales, new Comparator<Locale>() {
            public int compare (Locale l1, Locale l2) {
                return l1.getDisplayName().compareTo (l2.getDisplayName());
            }
        });
        for (Locale loc : locales) {
            System.out.println ("== Locale: " + loc.getLanguage() + "-" + loc.getCountry() + ": " + loc.getDisplayName());
            cal = Calendar.getInstance (loc);
            System.out.println (m.get (cal.getFirstDayOfWeek()));
        }
    }
}
== Locale: sq-: albanês
Domingo
== Locale: sq-AL: albanês (Albânia)
Domingo
== Locale: de-: alemão
Segunda-feira
== Locale: de-DE: alemão (Alemanha)
Segunda-feira
== Locale: de-LU: alemão (Luxemburgo)
Segunda-feira
== Locale: de-CH: alemão (Suíça)
Segunda-feira
== Locale: de-AT: alemão (Áustria)
Segunda-feira
== Locale: be-: bielo-russo
Domingo
== Locale: be-BY: bielo-russo (Belarus)
Domingo
== Locale: bg-: búlgaro
Domingo
== Locale: bg-BG: búlgaro (Bulgária)
Domingo
== Locale: ca-: catalão
Segunda-feira
== Locale: ca-ES: catalão (Espanha)
Segunda-feira
== Locale: zh-: chinês
Domingo
== Locale: zh-CN: chinês (China)
Domingo
== Locale: zh-SG: chinês (Cingapura)
Domingo
== Locale: zh-HK: chinês (Hong Kong, Região Admin. Especial da China)
Domingo
== Locale: zh-TW: chinês (Taiwan)
Domingo
== Locale: ko-: coreano
Domingo
== Locale: ko-KR: coreano (Coréia, Sul)
Domingo
== Locale: hr-: croata
Segunda-feira
== Locale: hr-HR: croata (Croácia)
Segunda-feira
== Locale: da-: dinamarquês
Segunda-feira
== Locale: da-DK: dinamarquês (Dinamarca)
Segunda-feira
== Locale: sk-: eslovaco
Segunda-feira
== Locale: sk-SK: eslovaco (Eslováquia)
Segunda-feira
== Locale: sl-: eslovênio
Domingo
== Locale: sl-SI: eslovênio (Eslovênia)
Domingo
== Locale: es-: espanhol
Segunda-feira
== Locale: es-AR: espanhol (Argentina)
Segunda-feira
== Locale: es-BO: espanhol (Bolívia)
Segunda-feira
== Locale: es-CL: espanhol (Chile)
Segunda-feira
== Locale: es-CO: espanhol (Colômbia)
Segunda-feira
== Locale: es-CR: espanhol (Costa Rica)
Segunda-feira
== Locale: es-SV: espanhol (El Salvador)
Segunda-feira
== Locale: es-EC: espanhol (Equador)
Segunda-feira
== Locale: es-ES: espanhol (Espanha)
Segunda-feira
== Locale: es-US: espanhol (Estados Unidos)
Domingo
== Locale: es-GT: espanhol (Guatemala)
Segunda-feira
== Locale: es-HN: espanhol (Honduras)
Segunda-feira
== Locale: es-MX: espanhol (México)
Segunda-feira
== Locale: es-NI: espanhol (Nicarágua)
Segunda-feira
== Locale: es-PA: espanhol (Panamá)
Segunda-feira
== Locale: es-PY: espanhol (Paraguai)
Segunda-feira
== Locale: es-PE: espanhol (Peru)
Segunda-feira
== Locale: es-PR: espanhol (Porto Rico)
Segunda-feira
== Locale: es-DO: espanhol (República Dominicana)
Segunda-feira
== Locale: es-UY: espanhol (Uruguai)
Segunda-feira
== Locale: es-VE: espanhol (Venezuela)
Segunda-feira
== Locale: et-: estoniano
Segunda-feira
== Locale: et-EE: estoniano (Estônia)
Segunda-feira
== Locale: fi-: finlandês
Segunda-feira
== Locale: fi-FI: finlandês (Finlândia)
Segunda-feira
== Locale: fr-: francês
Segunda-feira
== Locale: fr-BE: francês (Bélgica)
Segunda-feira
== Locale: fr-CA: francês (Canadá)
Domingo
== Locale: fr-FR: francês (França)
Segunda-feira
== Locale: fr-LU: francês (Luxemburgo)
Segunda-feira
== Locale: fr-CH: francês (Suíça)
Segunda-feira
== Locale: el-: grego
Segunda-feira
== Locale: el-CY: grego (Chipre)
Segunda-feira
== Locale: el-GR: grego (Grécia)
Segunda-feira
== Locale: iw-: hebraico
Domingo
== Locale: iw-IL: hebraico (Israel)
Domingo
== Locale: hi-IN: hindi (Índia)
Domingo
== Locale: nl-: holandês
Segunda-feira
== Locale: nl-BE: holandês (Bélgica)
Segunda-feira
== Locale: nl-NL: holandês (Países Baixos)
Segunda-feira
== Locale: hu-: húngaro
Segunda-feira
== Locale: hu-HU: húngaro (Hungria)
Segunda-feira
== Locale: in-: indonésio
Domingo
== Locale: in-ID: indonésio (Indonésia)
Segunda-feira
== Locale: en-: inglês
Domingo
== Locale: en-AU: inglês (Austrália)
Domingo
== Locale: en-CA: inglês (Canadá)
Domingo
== Locale: en-SG: inglês (Cingapura)
Domingo
== Locale: en-US: inglês (Estados Unidos)
Domingo
== Locale: en-PH: inglês (Filipinas)
Domingo
== Locale: en-IE: inglês (Irlanda)
Segunda-feira
== Locale: en-MT: inglês (Malta)
Domingo
== Locale: en-NZ: inglês (Nova Zelândia)
Domingo
== Locale: en-GB: inglês (Reino Unido)
Segunda-feira
== Locale: en-ZA: inglês (África do Sul)
Domingo
== Locale: en-IN: inglês (Índia)
Domingo
== Locale: ga-: irlandês
Domingo
== Locale: ga-IE: irlandês (Irlanda)
Domingo
== Locale: is-: islandês
Segunda-feira
== Locale: is-IS: islandês (Islândia)
Segunda-feira
== Locale: it-: italiano
Segunda-feira
== Locale: it-IT: italiano (Itália)
Segunda-feira
== Locale: it-CH: italiano (Suíça)
Segunda-feira
== Locale: ja-: japonês
Domingo
== Locale: ja-JP: japonês (Japão)
Domingo
== Locale: ja-JP: japonês (Japão,JP)
Domingo
== Locale: lv-: letão
Domingo
== Locale: lv-LV: letão (Letônia)
Domingo
== Locale: lt-: lituano
Segunda-feira
== Locale: lt-LT: lituano (Lituânia)
Segunda-feira
== Locale: mk-: macedônio
Domingo
== Locale: mk-MK: macedônio (Macedônia)
Domingo
== Locale: ms-: malaio
Domingo
== Locale: ms-MY: malaio (Malásia)
Segunda-feira
== Locale: mt-: maltês
Domingo
== Locale: mt-MT: maltês (Malta)
Domingo
== Locale: no-: norueguês
Segunda-feira
== Locale: no-NO: norueguês (Noruega)
Segunda-feira
== Locale: no-NO: norueguês (Noruega,Nynorsk)
Segunda-feira
== Locale: pl-: polonês
Segunda-feira
== Locale: pl-PL: polonês (Polônia)
Segunda-feira
== Locale: pt-: português
Segunda-feira
== Locale: pt-BR: português (Brasil)
Segunda-feira
== Locale: pt-PT: português (Portugal)
Segunda-feira
== Locale: ro-: romeno
Segunda-feira
== Locale: ro-RO: romeno (Romênia)
Segunda-feira
== Locale: ru-: russo
Segunda-feira
== Locale: ru-RU: russo (Rússia)
Segunda-feira
== Locale: sv-: sueco
Segunda-feira
== Locale: sv-SE: sueco (Suécia)
Segunda-feira
== Locale: sr-: sérvio
Segunda-feira
== Locale: sr-BA: sérvio (Bósnia-Herzegovina)
Segunda-feira
== Locale: sr-ME: sérvio (Montenegro)
Segunda-feira
== Locale: sr-RS: sérvio (Serbia)
Segunda-feira
== Locale: sr-CS: sérvio (Sérvia e Montenegro)
Segunda-feira
== Locale: th-: tailandês
Domingo
== Locale: th-TH: tailandês (Tailândia)
Domingo
== Locale: th-TH: tailandês (Tailândia,TH)
Domingo
== Locale: cs-: tcheco
Segunda-feira
== Locale: cs-CZ: tcheco (República Tcheca)
Segunda-feira
== Locale: tr-: turco
Segunda-feira
== Locale: tr-TR: turco (Turquia)
Segunda-feira
== Locale: uk-: ucraniano
Segunda-feira
== Locale: uk-UA: ucraniano (Ucrânia)
Segunda-feira
== Locale: vi-: vietnamita
Domingo
== Locale: vi-VN: vietnamita (Vietnã)
Domingo
== Locale: ar-: árabe
Sabado
== Locale: ar-DZ: árabe (Argélia)
Sabado
== Locale: ar-SA: árabe (Arábia Saudita)
Sabado
== Locale: ar-BH: árabe (Bahrain)
Sabado
== Locale: ar-QA: árabe (Catar)
Sabado
== Locale: ar-EG: árabe (Egito)
Sabado
== Locale: ar-AE: árabe (Emirados Árabes Unidos)
Sabado
== Locale: ar-IQ: árabe (Iraque)
Sabado
== Locale: ar-YE: árabe (Iêmen)
Sabado
== Locale: ar-JO: árabe (Jordânia)
Sabado
== Locale: ar-KW: árabe (Kuwait)
Sabado
== Locale: ar-LB: árabe (Líbano)
Sabado
== Locale: ar-LY: árabe (Líbia)
Sabado
== Locale: ar-MA: árabe (Marrocos)
Sabado
== Locale: ar-OM: árabe (Omã)
Sabado
== Locale: ar-SD: árabe (Sudão)
Sabado
== Locale: ar-SY: árabe (Síria)
Sabado
== Locale: ar-TN: árabe (Tunísia)
Sabado
H

OK, reportei como bug no site da Sun. Vamos ver no que dá.

edmarr

Eh vamos aguardar para ver o que acontece . :shock:

H

Status do problema: 15 dias, e nenhum feedback da Sun. Parece que eles não estão nem @#%*&%§ pro bug.

Criado 27 de agosto de 2009
Ultima resposta 12 de set. de 2009
Respostas 7
Participantes 4