Olá Pessoal, tudo bom?
Semana retrasada nós começamos a observar um código relacionado com conversão de datas, como você pode ver no seguinte link. Agora nós iremos começar a ver a resolução para o problema. No post de hoje nós iremos fazer com que os testes unitários apresentados no post da semana passada funcionem. Para isso precisamos resolver alguns pequenos detalhes de implementação. Confira na continuação do post.
Formato de Datas – Adaptando ao converter
O post da semana passada, nos apresentou a classe SimpleDateFormat e seus recursos de formatação de datas. Como podemos adaptar isso para o nosso converter?
Uma forma seria deixar o parâmetro como está, ou seja, com uma String. O problema principal desta abordagem é que qualquer informação dentro de uma String poderá ser informada e isso pode gerar muitos problemas, pois sempre temos que tratar de verificar se o formato enviado é correto.
Uma forma um pouco mais robusta de fazer isso é a utilização de um Enum. Se você não sabe o que é isso de uma olhada nesse post. Podemos criar um enum externo, mas nesse nosso caso é melhor criar um enum interno à classe, pois o domínio dela deve se estender sobre essa classe de conversão de datas. Assim vamos modificar um pouco o código da classe, acrescentando um enum DateFormat interno à classe, como pode ser visto no código abaixo:
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 |
package br.com.mauda.exemplos.dates.versao7.exemplo001.v2; import java.util.Date; import java.util.GregorianCalendar; public class ConvertDate { public enum DateFormat { USA_FORMAT("MM/dd/yyyy"), BR_FORMAT("dd/MM/yyyy"); private String format; private DateFormat(String format) { this.format = format; } public String getFormat() { return format; } } public static Date parseDate(String date, String formato) { int primeiraBarra = date.indexOf("/"); int segundaBarra = date.lastIndexOf("/"); int dia = Integer.parseInt(date.substring(0, primeiraBarra)); int mes = Integer.parseInt(date.substring(primeiraBarra + 1, segundaBarra)); int ano = Integer.parseInt(date.substring(segundaBarra + 1)); GregorianCalendar gc = new GregorianCalendar(ano, mes, dia); return gc.getTime(); } } |
Agora é necessário mudar na passagem de parâmetros do método parseDate() para aceitar o Enum criado e não mais String. Dessa forma estamos garantindo que não haverá mais formatos inválidos, que estarão fugindo do especificado pelo seu sistema. Outro ponto positivo é que qualquer desenvolvedor que comece a trabalhar no projeto saberá que é necessário informar um Enum para que possa ser realizado o parser de uma data. O código abaixo contempla a alteração do parâmetro do método parseDate():
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 |
package br.com.mauda.exemplos.dates.versao7.exemplo001.v2; import java.util.Date; import java.util.GregorianCalendar; public class ConvertDate { public enum DateFormat { USA_FORMAT("MM/dd/yyyy"), BR_FORMAT("dd/MM/yyyy"); private String format; private DateFormat(String format) { this.format = format; } public String getFormat() { return format; } } public static Date parseDate(String date, DateFormat formato) { int primeiraBarra = date.indexOf("/"); int segundaBarra = date.lastIndexOf("/"); int dia = Integer.parseInt(date.substring(0, primeiraBarra)); int mes = Integer.parseInt(date.substring(primeiraBarra + 1, segundaBarra)); int ano = Integer.parseInt(date.substring(segundaBarra + 1)); GregorianCalendar gc = new GregorianCalendar(ano, mes, dia); return gc.getTime(); } } |
E isso também irá causar uma alteração na classe de testes, para isso vamos utilizar os formatos definidos no Enum DateFormat, conforme código abaixo:
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 |
package br.com.mauda.exemplos.dates.versao7.exemplo001.v2; import org.junit.Test; public class Teste { @Test public void testeOK(){ ConvertDate.parseDate("08/05/2016", ConvertDate.DateFormat.BR_FORMAT); } @Test public void testeDataNula(){ ConvertDate.parseDate(null, ConvertDate.DateFormat.BR_FORMAT); } @Test public void testeFormatoNulo(){ ConvertDate.parseDate("08/05/2016", null); } @Test public void testeDataFormatoDiferentes(){ ConvertDate.parseDate("08/05/2016", ConvertDate.DateFormat.USA_FORMAT); } } |
Apesar de inserido esse Enum, ainda sim este não é utilizado dentro do método, dessa forma vamos começar as alterações internas no método parseDate().
Metodo parse() da classe SimpleDateFormat
Existe um método parse na classe SimpleDateFormat chamado parse(), o qual realiza o parse de String de uma data, no formato indicado no construtor do SimpleDateFormat, e retorna uma java.util.Date com o valor correto. Esse método será utilizado para que possamos transformar as datas de acordo com o formato passado. Veja como ficou no exemplo abaixo:
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 |
package br.com.mauda.exemplos.dates.versao7.exemplo001.v2; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.GregorianCalendar; public class ConvertDate { public enum DateFormat { USA_FORMAT("MM/dd/yyyy"), BR_FORMAT("dd/MM/yyyy"); private String format; private DateFormat(String format) { this.format = format; } public String getFormat() { return format; } } public static Date parseDate(String date, DateFormat formato) { SimpleDateFormat sdf = new SimpleDateFormat(formato.getFormat()); try { return sdf.parse(date); } catch (ParseException e) { return null; } } } |
Todo o código que existia anteriormente deu lugar a esse código com a utilização da classe SimpleDateFormat.
Se você tentar rodar novamente verá que 2 testes deram erros de NullPointerException, mas esse tratamento ficará para um próximo post.
finnaly{
Duvidas ou sugestões? Deixe 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