Olá Pessoal, tudo bom?
Semana passada nós começamos a observar um código relacionado com conversão de datas, como você pode ver no seguinte link. O primeiro ponto para melhorarmos aquele código está na parte de formatação de datas. A fim de elucidar alguns conhecimentos a respeito disso, nós iremos explanar um pouco a respeito da classe SimpleDateFormat que auxilia a formatar datas. Após essa explanação, semana que vem continuamos a melhorar aquele código do link acima.
Formato de Datas
O primeiro aspecto a ser tratado para resolver os problemas do teste será o formato de datas. Nós temos que os testes 3 e 4 ignoraram completamente o formato das datas passado. Assim o primeiro aspecto aqui é a utilização de uma classe Java chamada java.text.SimpleDateFormat, aqui está sua API.
O funcionamento dessa classe ocorre da seguinte forma, nós passamos um formato de data, respeitando algumas regras, e depois podemos realizar a formatação de uma instância da classe java.util.Date em String ou a criação de uma instância da classe java.util.Date a partir de uma String.
Regras para criar formato de Datas
O formato de Datas é uma String formada por vários caracteres. Cada um desses caracteres representam uma unidade de tempo, como Dia, Mês, Ano, Hora, Minuto entre outras.
Os principais caracteres estão descritos na tabela abaixo. Repare que existem diferenças entre os caracteres maiúsculos e minúsculos.
Caracter | Unidade de Tempo | Representação | Exemplo |
---|---|---|---|
G | Designador da Era | Text | AD (Anno Domini) ;d.C. |
y | Ano | Year | 1996; 96 |
Y | Week year((Considera a primeira semana completa do ano, por exemplo, primeiro de janeiro de 2014 caiu em uma quarta, assim se formatarmos uma data no dia 29, 30 ou 31 de dezembro de 2013, ele irá exibir o ano 2014.)) | Year | 2009; 09 |
M | Mês do Ano | Month | Maio, Mai, 05, 5 |
L | Mês do Ano ((Existe uma diferença entre o de cima, mas não consegui identificar, quando encontrar atualizo aqui)) | Month | Maio, Mai, 05, 5 |
w | Semana do Ano | Number | 21 |
W | Semana do Mês | Number | 2 |
D | Dia do Ano | Number | 189 |
d | Dia do Mês | Number | 10 |
F | Dia da Semana no Mês((Por exemplo, hoje 16/05/2016, irá produzir o número 3, porque é a terceira segunda do mês)) | Number | 2 |
E | Nome do Dia | Text | Segunda; Seg |
u | Número do Dia da Semana ((Se o calendário está configurado para que o Domingo seja o primeiro dia da semana, então este será 1, 2 para segunda e assim por diante até o sábado que será o 7. Se estiver configurado para começar a semana na segunda, então o 1 será segunda e 7 será o domingo)) | Number | 1 |
a | Marcador de AM/PM | Text | AM; PM |
H | Hora do Dia começando as 00 horas (0-23) | Number | 0 |
k | Hora do Dia começando as 01 horas (1-24) | Number | 24 |
K | Hora do Dia em am/pm começando as 00 horas (0-11) | Number | 0 |
h | Hora do Dia em am/pm começando as 01 horas (1-12) | Number | 12 |
m | Minutos da Hora | Number | 30 |
s | Segundos do Minuto | Number | 55 |
S | MIlisegundos do Minuto | Number | 978 |
z | Time zone | General time zone | Pacific Standard Time; PST; GMT-08:00 |
Z | Time zone | RFC 822 time zone | -0800 |
X | Time zone | ISO 8601 time zone | -08; -0800; -08:00 |
A parte de representação será explicada em um futuro artigo, mas se você quiser explorar dá uma olhada na API do SimpleDateFormat. Além disso também ficarei devendo uma explicação sobre timezone, que ficará para um artigo futuro.
Abaixo está um teste que usa a ferramenta JUnit para imprimir algumas formatações das datas da data atual. Para facilitar esse código está disponível no projeto Exemplos no Repositório Git do Bitbucket. Se você não sabe como clonar um repositório, veja meus tutoriais Versionamento Git na IDE Eclipse.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
package br.com.mauda.exemplos.simpleDateFormat.exemplo001; import java.text.SimpleDateFormat; import java.util.Date; import org.junit.Test; public class Teste { @Test public void teste(){ Date data = new Date();//Pega a data atual System.out.println("\nFormato: " + "yyyy.MM.dd G 'at' HH:mm:ss z"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z"); System.out.println("Formato Aplicado: " + sdf.format(data)); System.out.println("\nFormato: " + "EEE, MMM d, ''yy"); sdf = new SimpleDateFormat("EEE, MMM d, ''yy"); System.out.println("Formato Aplicado: " + sdf.format(data)); System.out.println("\nFormato: " + "h:mm a"); sdf = new SimpleDateFormat("h:mm a"); System.out.println("Formato Aplicado: " + sdf.format(data)); System.out.println("\nFormato: " + "hh 'o''clock' a, zzzz"); sdf = new SimpleDateFormat("hh 'o''clock' a, zzzz"); System.out.println("Formato Aplicado: " + sdf.format(data)); System.out.println("\nFormato: " + "K:mm a, z"); sdf = new SimpleDateFormat("K:mm a, z"); System.out.println("Formato Aplicado: " + sdf.format(data)); System.out.println("\nFormato: " + "yyyyy.MMMMM.dd GGG hh:mm aaa"); sdf = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa"); System.out.println("Formato Aplicado: " + sdf.format(data)); System.out.println("\nFormato: " + "EEE, d MMM yyyy HH:mm:ss Z"); sdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z"); System.out.println("Formato Aplicado: " + sdf.format(data)); System.out.println("\nFormato: " + "yyMMddHHmmssZ"); sdf = new SimpleDateFormat("yyMMddHHmmssZ"); System.out.println("Formato Aplicado: " + sdf.format(data)); System.out.println("\nFormato: " + "yyyy-MM-dd'T'HH:mm:ss.SSSZ"); sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); System.out.println("Formato Aplicado: " + sdf.format(data)); System.out.println("\nFormato: " + "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); System.out.println("Formato Aplicado: " + sdf.format(data)); System.out.println("\nFormato: " + "YYYY-'W'ww-u"); sdf = new SimpleDateFormat("YYYY-'W'ww-u"); System.out.println("Formato Aplicado: " + sdf.format(data)); } } |
A execução desse teste irá gerar o seguinte texto no Console do Eclipse:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Formato: yyyy.MM.dd G 'at' HH:mm:ss z Formato Aplicado: 2016.05.15 d.C. at 20:14:40 BRT Formato: EEE, MMM d, ''yy Formato Aplicado: Dom, mai 15, '16 Formato: h:mm a Formato Aplicado: 8:14 PM Formato: hh 'o''clock' a, zzzz Formato Aplicado: 08 o'clock PM, Fuso horário de Brasília Formato: K:mm a, z Formato Aplicado: 8:14 PM, BRT Formato: yyyyy.MMMMM.dd GGG hh:mm aaa Formato Aplicado: 02016.Maio.15 d.C. 08:14 PM Formato: EEE, d MMM yyyy HH:mm:ss Z Formato Aplicado: Dom, 15 mai 2016 20:14:40 -0300 Formato: yyMMddHHmmssZ Formato Aplicado: 160515201440-0300 Formato: yyyy-MM-dd'T'HH:mm:ss.SSSZ Formato Aplicado: 2016-05-15T20:14:40.438-0300 Formato: yyyy-MM-dd'T'HH:mm:ss.SSSXXX Formato Aplicado: 2016-05-15T20:14:40.438-03:00 Formato: YYYY-'W'ww-u Formato Aplicado: 2016-W21-7 |
Repare que os caracteres utilizados podem ser repetidos conforme a necessidade, variando o seu resultado. Por exemplo, o caracter ‘y’, para a formatação da linha 16 (yyyy) gera um resultado 2016, já a formatação da linha 20 (yy) gera um resultado 16. Assim a combinação caracteres + quantidades pode gerar vários tipos de resultados. Depende do que você necessite em seu código.
finnaly{
O formato de datas é algo muito importante para ajudar na continuação de nosso post sobre melhorar o parser de datas. Caso tenham ficado duvidas ou seguestões envie seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Leave a Reply