1. Classe DateTimeFormatter

A classe especial DateTimeFormatterencontra seu caminho na API Date Time. Seu objetivo é tornar o mais fácil possível para os programadores converter uma data e hora no formato exato que desejam. E estamos felizes em informar que os criadores do Java tiveram sucesso.

Usá-lo é muito fácil. Primeiramente, você precisa criar uma DateTimeFormatterclasse e passar em um padrão que especifique como ela irá exibir a data e hora:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern);

Onde dtfé uma DateTimeFormattervariável. é um método estático da classe. E padrão é uma string que especifica o padrão que será usado para exibir a data e a hora.DateTimeFormatter.ofPattern()DateTimeFormatter

Exemplos

Código Saída do console
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yy");
String text = dtf.format( LocalDateTime.now() );
System.out.println(text);


02-22-19

No exemplo acima, utilizamos o ofPattern()método para criar um DateTimeFormatterobjeto baseado no padrão. E na próxima linha, usamos o format()método para converter um LocalDateTimeobjeto em uma string. Você vê o resultado na tela.

Você pode passar quase qualquer objeto da API Date Time para o format()método.

A estática ofPattern()também é muito simples: pega um padrão como argumento e retorna um DateTimeFormatterobjeto. A parte mais interessante é encontrada no padrão.


2. Padrão de formatação

A string passada como padrão é usada como padrão ao exibir informações. MM é substituído pelo número do mês, dd pelo dia do mês e yy pelo número do ano. O caso das cartas é importante.

A tabela completa para esses padrões de tempo é esta:

Carta Significado
y Ano
M Mês
d Dia
H Horas
m Minutos
s Segundos
S Milésimos de segundo
n Nanossegundos.

Não é particularmente difícil de lembrar.

Mas por que o padrão no exemplo inclui letras repetidas MM, dd e yy? Bem, é aqui que fica mais interessante.

Ideia geral

O número de letras afeta o comprimento do texto. Quanto mais letras houver, mais longo será o texto.

Se a letra H for especificada uma vez, 9 horas serão exibidas como 9, mas se a letra H for especificada duas vezes seguidas, 9 horas serão exibidas como 09.

Se a letra y for especificada 2 vezes seguidas, o ano será escrito com 2 dígitos. Se ocorrer 4 vezes seguidas, serão usados ​​4 dígitos.

Se a letra M for especificada 2 vezes seguidas, o número do mês será gravado. Se 3 vezes seguidas, o nome do mês (suas 3 primeiras letras) é usado. Se 4 vezes seguidas, o nome completo do mês é usado.

Exemplo:

Código Saída do console
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMMM-dd-yyyy");
String text = dtf.format( LocalDateTime.now() );
System.out.println(text);


February-22-2019


3. Tabela completa de padrões

A tabela completa é bem grande e super interessante:

Padrão Variações do padrão Exemplo Descrição
y aaaa, aaaa 19; 2019 Ano
M/L M, MM, MM, MMMM, MMMM 1; 01; Janeiro; Janeiro; J Mês
d d, dd 9; 09 Dia
H H, HH 2; 02 Horas
m m, mm 3; 03 Minutos
s s, ss 5; 05 Segundos
S S, SS, SSS, ... 1; 12; 123 Milésimos de segundo
n n 123456789 Nanossegundos
G G,GGGG,GGGG DE ANÚNCIOS; Ano Domini; A; Era
Q/q q, qq, qqq, qqqq 3; 03; Q3; 3º trimestre Trimestre
c c 13 Semana do ano
C C 3 Semana do mês
E EEEE, EEEE, EEEE Seg; Segunda-feira; M Dia da semana
e/c e, ee, eee, eee, eee 1; 01; Seg; Segunda-feira; M Dia da semana
a a PM AM ou PM
h h 12 Relógio de 12 horas.
V VV Europa/Helsinque Fuso horário
z z zzzz EET; Hora Padrão da Europa Oriental Fuso horário
O OOOOO GMT+2; GMT+02:00 Fuso horário

By the way, esta não é realmente uma versão completa. Você pode encontrar a versão mais completa aqui .



4. Tempo de análise

A DateTimeFormatterclasse também é interessante por sua capacidade não apenas de converter uma data e hora em uma string de acordo com um determinado padrão, mas também de realizar a operação inversa!

Analisar uma string é o processo de dividi-la em tokens significativos.

Aqui está o que parece:

Código Saída do console
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMMM-dd-yyyy");
LocalDate date = LocalDate.parse("February-23-2019", dtf);
System.out.println(date);


February-23-2019

Primeiro, criamos um DateTimeFormatterobjeto e definimos o padrão usado para análise.

Em seguida, chamamos o método LocalDate.parse()or LocalTime.parse()ou LocalDateTime.parse()e passamos a string a ser analisada junto com o DateTimeFormatterobjeto, que entende como analisar o texto passado e qual padrão deve ser utilizado para isso.

Outro exemplo: desta vez vamos analisar o tempo.

Código Saída do console
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
LocalTime time = LocalTime.parse("23:59:59", dtf);
System.out.println(time);


23:59:59