Trabalhando com datas
Este artigo resolve uma dúvida muito comum em programadores recém chegados ao Java. Como alterar o formato de uma data, do formato americano para o brasileiro, por exemplo. Outras questões surgem após começar a trabalhar com datas como, por exemplo, comparações entre elas. Tudo isso será demonstrado nesse pequeno tutorial. As explicações estão simples e o código comentado. Dica: Nunca se esqueça de usar as funções da classe java.util.Date para fazer comparações de datas. É mais elegante utilizar os métodos do que a comparação através dos valores dogetTime(). Evita usar os métodos depreciados (deprecated) da Date. A classejava.util.Date está em desuso (ainda não está deprecated), e é altamente recomendado você utilizar um java.util.GregorianCalendar, que é muito mais robusto. Porém, muitas APIs ainda utilizam a Date, o que nos obriga a usá-la. Algumas pessoas ainda preferem a utilização de um long, para guardar a data em milisegundos, já que muitas pessoas não gostam da API do java para datas.
O Formatador
Basicamente usamos uma instância da classe java.text.SimpleDateFormat para converter um objeto Date em diferentes formatos de String, e vice-versa. Para instanciar um transformador, devemos passar o formato que ele irá trabalhar. No exemplo a seguir, o formato brasileiro:- // cria o formatador
- SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
Você pode utilizar várias letras para indicar diferentes coisas, não precisa ficar só com "d", "m", "y". Você pode encontrar os outros símbolos na documentaçãoda classe. Agora podemos transformar uma string contendo o valor 18/09/1981em um objeto data:
- Date data = formatador.parse("18/09/1981");
E transformar o objeto data de volta em uma string contendo o valor 19810918(note que o formato é outro, apenas como exemplo).
- // cria o formatador
- SimpleDateFormat formatador = new SimpleDateFormat("yyyyMMdd");
- // cria a string
- String novoFormato = novoFormatador.format(data);
Dica: Preste atenção que a classe SimpleDateFormat não se responsabiliza por acessos de threads diferentes em suas funções. Isso significa que você deve ter uma instância dessa classe sendo chamada no máximo por uma thread em um único instante. Para tanto, sincronize o acesso no objeto ou simplesmente não mantenha o objeto como membro de uma classe mas sim como variável local de um método.
Comparações e getTime()
O método getTime() da classe Date é utilizado para retornar o numero de milisegundos que se passaram desde um certo dia (primeiro de janeiro de 1970). Ai vem a tentação de usar a comparação de maior e menor para saber qual data veio antes de qual. Porém é muito mais elegante utilizar os métodosbefore() e after() da mesma classe. Outro método que você pode utilizar é ocompareTo(), que retorna 0 no caso das duas datas serem a mesma, um valor negativo se a data representada pelo objeto na qual o método for chamado vier antes da data argumento e um valor positivo no caso contrário. Para criar um objeto data com a data atual usamos o seguinte código (mais simples do que voce esperava):- // pega o dia de hoje
- Date data = new Date();
Ou então, e já aproveitando para mostrar o GregorianCalendar:
- // um calendar também é criado com a data atual
- GregorianCalendar calendar = new GregorianCalendar();
- Date data = calendar.getTime();
E por último você pode utilizar o método setTime() para setar um novo valor para seu objeto Date, alcançando a funcionalidade de acrescentar uma hora (ou algum outro valor) com o seguinte tipo de código:
- // pega o dia de hoje
- Date data = new Date();
- // adiciona 1000 milisegundos, vezes 60 (um minuto), vezes 60 (uma hora), vezes 1
- data.setTime(data.getTime() + 1 * 60 * 60 * 1000);
Dica: Para saber se um objeto de tipo java.util.Date é o dia de hoje não basta utilizar os métodos before(), after() ou compareTo, pois eles comparam até os milisegundos. Para atingir tal objetivo crie uma string a partir do objeto data, extraindo somente o dia, mês e ano e compare essa string com uma outra string representando a outra data que deseja comparar. Se você vai utilizar muito este tipo de modificação nas datas, recomendo muito que você utilize ojava.util.GregorianCalendar. Utilize Date apenas se você realmente precisa, já que outra class trabalha com ela. Utilizando um GregorianCalendar, você pode extrair a data dele utilizando o getTime(), devolvendo um Date, como visto na listagem anterior. Você pode baixar um programa de demonstração com este tutorial. Este arquivo java pode ser compilado e rodado:
- java ExemploData dataOriginal formatoOriginal formatoFinal
0 comentários :
Postar um comentário