Boa noite galera!
Estou estreando meu humilde blog com o objetivo de colocar algumas dicas e problemas cotidianos na vida deste simples programador (se você está procurando um blog de auto ajuda ou desabafos, aqui não é o seu lugar).
Para começar com o pé direito (ou não), resolvi dedicar este primeiro POST à incrível dificuldade em se trabalhar com datas, seja em qualquer âmbito, bancos de dados, linguagens de programação e por aí vai.
Como sou entusiasta Java e já sofri (muito) com esses malditos objetos de data, hoje tirei a noite para desvendá-los de vez e quem sabe diminuir meu ódio por eles. E sabe que funcionou?
Não falando ainda de API de terceiros para manipular datas, se olharmos com carinho para a API nativa do Java para trabalhar como tal, temos as seguintes classes:
- java.util.Date: Representa uma data e hora/mutáveis, ou seja, poderemos criar um objeto date simplesmente desta forma: Date data = new Date() e posteriormente realizar operações na data obtida (porém com outros objetos que serão listados a seguir);
- java.util.Calendar: Esta poderosa classe nos permite diversas operações com data, desde acrescentar meses, dias, etc, até descobrirmos em que dia da semana será 22/01/2030;
- java.text.DateFormat: Esta classe é usada para nos ajudar com a formatação de datas para todos os locais do mundo, ou seja, dependendo do local que a sua aplicação tiver rodando, poderá apresentar a data de acordo com o local;
- java.util.Locale: É a classe que permite trabalhar com todos os locais do mundo. Ela é utilizada em conjunto com Calendar e DateFormat. Podemos especificar por exemplo, que estamos trabalhando com formato de data/hora do Japão (mais sobre isso a seguir).
Aqui vai um pequeno trecho de código que mostra o que já foi falado:
//Criando dois Locale's: um para o Japão e um para Portugal
Locale locJapan = new Locale("ja", "JP");
Locale locPortuguese = new Locale("pt","PT");
//Criando dois Calendar passando os locais especificados
Calendar dataJapao = Calendar.getInstance(locJapan);
Calendar dataPortugal = Calendar.getInstance(locPortuguese);
//transformando os objetos Calendar em Date para que possamos formatá-los e apresentá-los na tela
Date dataJapaoEmDate = dataJapao.getTime();
Date dataPortugalEmDate = dataPortugal.getTime();
//aqui utilizamos o objeto DateFormat para especificarmos o formato desejado e o local
DateFormat dfJapao = DateFormat.getDateInstance(DateFormat.FULL,locJapan);
DateFormat dfPortugal = DateFormat.getDateInstance(DateFormat.FULL, locPortuguese);
//Obtendo um String com as datas formatadas
String dataFormatadaJapao = dfJapao.format(dataJapaoEmDate);
String dataFormatadaPortugal = dfPortugal.format(dataPortugalEmDate);
System.out.println("Data no formato Japonês: " + dataFormatadaJapao.toString());
System.out.println("Data no formato Português (Portugal): " + dataFormatadaPortugal.toString());
O resultado dessa "bagunça" é a seguinte:
//Criando dois Locale's: um para o Japão e um para Portugal
Locale locJapan = new Locale("ja", "JP");
Locale locPortuguese = new Locale("pt","PT");
//Criando dois Calendar passando os locais especificados
Calendar dataJapao = Calendar.getInstance(locJapan);
Calendar dataPortugal = Calendar.getInstance(locPortuguese);
//transformando os objetos Calendar em Date para que possamos formatá-los e apresentá-los na tela
Date dataJapaoEmDate = dataJapao.getTime();
Date dataPortugalEmDate = dataPortugal.getTime();
//aqui utilizamos o objeto DateFormat para especificarmos o formato desejado e o local
DateFormat dfJapao = DateFormat.getDateInstance(DateFormat.FULL,locJapan);
DateFormat dfPortugal = DateFormat.getDateInstance(DateFormat.FULL, locPortuguese);
//Obtendo um String com as datas formatadas
String dataFormatadaJapao = dfJapao.format(dataJapaoEmDate);
String dataFormatadaPortugal = dfPortugal.format(dataPortugalEmDate);
System.out.println("Data no formato Japonês: " + dataFormatadaJapao.toString());
System.out.println("Data no formato Português (Portugal): " + dataFormatadaPortugal.toString());
O resultado dessa "bagunça" é a seguinte:
Data no formato Japonês: 2012年12月13日
Data no formato Português (Portugal): Quinta-feira, 13 de Dezembro de 2012
Porém, fui muito superficial ao explicar o código. Como eu sei que havia um tal de DateFormat.FULL, ou ainda, como eu sei os códigos passados no construtor de Locale para o Japão e Portugal?
Bom, quanto a primeira pergunta, a classe DateFormat possui várias constantes que nos permitem escolher o formato desejado. Elas representam inteiros e o nome delas fica bem fácil de usar. No exemplo acima, foi utilizado FULL porque desejei a data no seu formato completo (dia, mês e ano - não necessariamente nessa ordem, vai variar de acordo com o local). Quanto a segunda pergunta, há referências na Internet para sabermos quais códigos podemos passar para o Locale, sendo lista de linguagens e lista e código de países.
Mas nem tudo são flores. Quem já precisou fazer operações de verdade com datas (saber a diferença de um período ou de horas) sabe que é praticamente impossível trabalhar com a API nativa do Java. Mas calma, há uma solução muito elegante e funciona que é uma beleza, a Joda Time - Java date and time API que permite fazer DIVERSAS operações complexas com datas e horas!
Bom, o exemplo mostra que se lermos com carinho a documentação (de verdade) podemos sim "fazer miséria" com datas.
Por hoje é só, obrigado e até a próxima.
Nenhum comentário:
Postar um comentário