- 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));
}
}
- 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));
}
}
- 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();
}
}
}
- 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);
}
}