Formatação e Conversão de Datas em Java

  1. Significado das Letras no Formato de Data

A letra y representa o ano: yyyy para ano com quatro dígitos (ex: 2023), yy para ano com dois dígitos (ex: 23).

M indica o mês: MM para mês com dois dígitos (ex: 02), M para mês com um dígito (ex: 2).

d representa o dia do mês, enquanto D indica o dia do ano.

h ou H indicam horas: h para formato de 12 horas, H para formato de 24 horas.

m é usado para minutos e s para segundos.

import java.util.Calendar;
import java.util.Date;
import java.text.SimpleDateFormat;

public class ExemploData {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        cal.set(2023, Calendar.FEBRUARY, 20);
        Date data = cal.getTime();

        SimpleDateFormat formAnoCompleto = new SimpleDateFormat("yyyyMMdd");
        SimpleDateFormat formAnoAbreviado = new SimpleDateFormat("yyMMdd");
        System.out.println("yyyyMMdd: " + formAnoCompleto.format(data));
        System.out.println("yyMMdd: " + formAnoAbreviado.format(data));

        SimpleDateFormat formMesCompleto = new SimpleDateFormat("yyyyMMdd");
        SimpleDateFormat formMesSimplificado = new SimpleDateFormat("yyyyMdd");
        System.out.println("yyyyMMdd: " + formMesCompleto.format(data));
        System.out.println("yyyyMdd: " + formMesSimplificado.format(data));

        SimpleDateFormat formHora12 = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss");
        SimpleDateFormat formHora24 = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
        System.out.println("hh-mm-ss: " + formHora12.format(data));
        System.out.println("HH-mm-ss: " + formHora24.format(data));
    }
}
  1. Diferença entre YYYYMMdd e yyyyMMdd

YYYY representa o ano da semana atual, considerando que a semana começa no domingo e termina no sábado. Se a semana cruzar o ano, ela é atribuída ao próximo ano. Por exemplo, 29/12/2021 é uma quarta-feira, e se o sábado for 01/01/2022, a semana pertence a 2022. Assim, YYYYMMdd pode mostrar 20221229, enquanto yyyyMMdd mostra 20211229. Por isso, em produção, geralmente usa-se yyyyMMdd.

import java.util.Calendar;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

public class ComparacaoFormatos {
    public static void main(String[] args) {
        Calendar calendario = Calendar.getInstance();

        calendario.set(2021, Calendar.DECEMBER, 25);
        Date data1 = calendario.getTime();

        calendario.set(2021, Calendar.DECEMBER, 29);
        Date data2 = calendario.getTime();

        calendario.set(2022, Calendar.JANUARY, 1);
        Date data3 = calendario.getTime();

        DateFormat formatoSimples = new SimpleDateFormat("yyyyMMdd");
        DateFormat formatoSemana = new SimpleDateFormat("YYYYMMdd");

        System.out.println("yyyyMMdd 25/12/2021: " + formatoSimples.format(data1));
        System.out.println("yyyyMMdd 29/12/2021: " + formatoSimples.format(data2));
        System.out.println("yyyyMMdd 01/01/2022: " + formatoSimples.format(data3));
        System.out.println("----");
        System.out.println("YYYYMMdd 25/12/2021: " + formatoSemana.format(data1));
        System.out.println("YYYYMMdd 29/12/2021: " + formatoSemana.format(data2));
        System.out.println("YYYYMMdd 01/01/2022: " + formatoSemana.format(data3));
    }
}
  1. Uso do SimpleDateFormat

Ao trabalhar com objetos Date, o SimpleDateFormat é usado para formatação. Ele não é seguro para uso em múltiplas threads, então deve ser criado como variável local dentro de métodos.

import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;

public class FormatacaoData {
    public static void main(String[] args) {
        Date hoje = new Date();
        SimpleDateFormat formatador = new SimpleDateFormat("yyyyMMdd");
        System.out.println("Data formatada: " + formatador.format(hoje));
        
        try {
            String textoData = "20230220";
            Date dataConvertida = formatador.parse(textoData);
            System.out.println("Data convertida: " + dataConvertida);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
  1. Uso do DateTimeFormatter

Ao utilizar LocalDateTime ou ZonedDateTime, o DateTimeFormatter é apropriado para formatação. Ele é seguro para múltiplas threads e pode ser reutilizado como uma única instância.

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class FormatadorModerno {
    public static void main(String[] args) {
        DateTimeFormatter formatadorEntrada = DateTimeFormatter.ofPattern("yyyy.MM.dd");
        String textoEntrada = "2022.03.05";
        LocalDate dataLocal = LocalDate.parse(textoEntrada, formatadorEntrada);
        System.out.println("Data parseada: " + dataLocal);

        DateTimeFormatter formatadorSaida = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        String textoSaida = dataLocal.format(formatadorSaida);
        System.out.println("Data formatada: " + textoSaida);
    }
}

Tags: java SimpleDateFormat DateTimeFormatter Formatação de Datas Calendário

Publicado em 6-24 19:29