Formatando Datas em Java
Autor: Claudio Weiler | Publicado: 2014-10-02T16:51:00-03:00

Nesta postagem vamos analisar como formatar datas para exibição ao usuário. Passando do simples e direto método java.util.Date.toString() e indo a exemplos prontos da completa e personalizável classe java.text.SimpleDateFormat.

Esta postagem serve como um complemento a nossa postagem anterior Formatando&nbsp;Mensagens&nbsp;em&nbsp;Java, onde, apesar de apresentar alguns exemplos de formatação de datas, o foco era a formatação de mensagens textuais completas, independente do tipo de dado.

Método toString() da classe java.util.Date()Esta é uma das formas mais simples e diretas de transformar uma data em um texto, infelizmente, este recurso não possui localização e a exibição sempre é feita em um padrão em inglês como no seguinte exemplo: Mon&nbsp;Sep&nbsp;29&nbsp;20:12:31&nbsp;BRT&nbsp;2014. Como solução rápida, nós teríamos como alternativa o método new java.util.Date().toLocaleString() que nos devolveria algo como: 29/09/2014&nbsp;20:12:31, algo já dentro do padrão brasileiro mas com um aviso de uso de método obsoleto (deprecated) no seu código.

A classe java.text.DateFormatA classe DateFormat possui métodos para recuperação de instâncias de formatadores de data e hora. Ela pode ser considerada a classe mais recomendável para formatação de datas, pois ela é baseada em alguns padrões que têm como objetivo garantir a localização do seu aplicativo, ou seja, você não precisa verificar como um data é representada em japonês, utilizando esta classe você garante a correta representação.

Estes padrões são limitados peles seguintes estilos:
DateFormat.SHORT - 29/09/14 para data e 20:12 para hora;
DateFormat.MEDIUM - 29/09/2014 para data e 20:12:31 para hora;
DateFormat.LONG - 29 de Setembro de 2014 para data e 20h12min31s BRT para hora;
DateFormat.FULL - Segunda-feira, 29 de Setembro de 2014 para data e 20h12min31s&nbsp;BRT para hora.
Os exemplos acima estão sendo exibidos conforme a localização definida para o padrão brasileiro de datas e horas, mas lembrando, que se este código for executado em um ambiente com localização diferente (inglês por exemplo) os formatos irão respeitar os padrões daquela localização sem que você precise realizar configurações adicionais.

DateFormat.getInstance().format(Date date)Este método retorna uma instância de formatador para data e hora de acordo com o estilo SHORT.
Por exemplo: 29/09/14 20:12

DateFormat.getDateInstance().format(Date date)Este método retorna uma instância de formatador para data de acordo com o estilo de data padrão.
Por exemplo: 29/09/2014

DateFormat.getTimeInstance().format(Date date)Este método retorna uma instância de formatador para hora de acordo com o estilo de hora padrão.
Por exemplo: 20:12:31

DateFormat.getDateTimeInstance().format(Date date)Este método retorna uma instância de formatador para data e hora de acordo com os estilos de data e hora padrões.
Por exemplo: 29/09/2014 20:12:31

DateFormat.getDateInstance(int style).format(Date date)Este método retorna uma instância de formatador para data de acordo com o estilo passado como parâmetro.

DateFormat.getTimeInstance(int style).format(Date date)Este método retorna uma instância de formatador para hora de acordo com o estilo passado como parâmetro.

DateFormat.getDateTimeInstance(int dateStyle, int timeStyle).format(Date date)Este método retorna uma instância de formatador para data e hora de acordo com os estilos passados como parâmetros.

A classe java.text.SimpleDateFormatComo acabamos de ver, a classe DateFormat é capaz de fornecer formatadores de data e hora com algum nível de opções para o uso em construções de mensagens a serem exibidas aos usuários. Vimos também que esta classe já é localizada e remove esta preocupação do desenvolvedor, mas esta característica também impede um nível de personalização mais detalhado dos formatos, então entra em cena a classe SimpleDateFormat que permite que as datas e horas sejam exibidas de qualquer forma desejada, mas colocando a localização nas mãos do desenvolvedor.

Para isto, devemos passar uma String, no construtor da classe, com as definições desejadas de acordo com os códigos que podem ser obtidos na documentação da API.

Alguns exemplos para new SimpleDateFormat(String pattern).format(Date date)
"EEEE, d 'de' MMMM 'de' yyyy": Segunda-feira, 29 de Setembro de 2014
"yyyy-MM-dd": 2014-09-29 *padrão SQL
"HH' horas e 'mm' minutos'": 20 horas e 12 minutos
"dd/MMM/yy E": 29/Set/14 Seg

O códigoComo de praxe, segue código para testes e modificações.
import java.text.DateFormat;
import java.text.SimpleDateFormat;

public class FormatandoDataHora {
 public static void main(String[] args) {
  java.util.Date date = new java.util.Date();

  System.out.println(date.toString());
  System.out.println(date.toLocaleString());

  System.out.println("");

  System.out.println(DateFormat.getInstance().format(date));
  System.out.println(DateFormat.getDateInstance().format(date));
  System.out.println(DateFormat.getTimeInstance().format(date));
  System.out.println(DateFormat.getDateTimeInstance().format(date));

  System.out.println("");

  System.out.println(DateFormat.getDateInstance(DateFormat.SHORT).format(date));
  System.out.println(DateFormat.getDateInstance(DateFormat.MEDIUM).format(date));
  System.out.println(DateFormat.getDateInstance(DateFormat.LONG).format(date));
  System.out.println(DateFormat.getDateInstance(DateFormat.FULL).format(date));

  System.out.println("");

  System.out.println(DateFormat.getTimeInstance(DateFormat.SHORT).format(date));
  System.out.println(DateFormat.getTimeInstance(DateFormat.MEDIUM).format(date));
  System.out.println(DateFormat.getTimeInstance(DateFormat.LONG).format(date));
  System.out.println(DateFormat.getTimeInstance(DateFormat.FULL).format(date));

  System.out.println("");

  System.out.println(DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.SHORT).format(date));
  System.out.println(DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.MEDIUM).format(date));
  System.out.println(DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.LONG).format(date));
  System.out.println(DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.FULL).format(date));

  System.out.println("");

  System.out.println(new SimpleDateFormat("EEEE, d 'de' MMMM 'de' yyyy").format(date));
  System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(date));
  System.out.println(new SimpleDateFormat("HH' horas e 'mm' minutos'").format(date));
  System.out.println(new SimpleDateFormat("dd/MMM/yy E").format(date));
 }
}