Converter String para Data em Java
1. Visão geral
Neste tutorial,we’ll explore several ways to convert String objects into Date objects. Começaremos com a nova APIDate Time -java.time que foi introduzida no Java 8 antes de examinar o antigo tipo de dadosjava.util.Date também usado para representar datas.
Para terminar, também veremos algumas bibliotecas externas para conversão usando Joda-Time e a classe Apache Commons LangDateUtils.
2. ConvertendoString emLocalDate ouLocalDateTime
[.s1]#LocalDate #and LocalDateTime are objetos data-hora imutáveis que representam uma data e, posteriormente, uma data e hora. Por padrão, as datas Java estão no formato ISO-8601, então, se tivermos qualquer string que represente uma data e hora neste formato, entãowe can use the parse() API of these classes directly.
Here tem um pouco mais de detalhes sobre esta nova API.
2.1. Usando a APIParse
The Date-Time API provide parse() methods for parsing a String that contains date and time information. To convert String objects to LocalDate and LocalDateTime objects, the String must represent a valid date or time de acordo comISO_LOCAL_DATE ouISO_LOCAL_DATE_TIME.
Caso contrário, umDateTimeParseException será lançado em tempo de execução.
Em nosso primeiro exemplo, vamos converter aString emjava.time.LocalDate:
LocalDate date = LocalDate.parse("2018-05-05");
Uma abordagem semelhante à anterior pode ser usada para converter umString em umjava.time.LocalDateTime:
LocalDateTime dateTime = LocalDateTime.parse("2018-05-05T11:50:55");
É importante observar que os objetosLocalDate eLocalDateTime são agnósticos de fuso horário. No entanto, o métodowhen we need to deal with time zone specific date and times we can use the ZonedDateTimeparse diretamente para obter uma data e hora específica do fuso horário:
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2015-05-05T10:15:30+01:00[Europe/Paris]");
Agora, vamos ver como convertemos seqüências de caracteres com um formato personalizado.
2.2. Usando a APIParse com um formatador personalizado
Converter umString com um formato de data personalizado em um objetoDate é uma operação amplamente difundida em Java.
Para isso,we’ll use the DateTimeFormatter class which provides numerous predefined formatters,e permite definir um formatador.
Vamos começar com um exemplo de uso de um dos formatadores predefinidos deDateTimeFormatter:
String dateInString = "19590709";
LocalDate date = LocalDate.parse(dateInString, DateTimeFormatter.BASIC_ISO_DATE);
No próximo exemplo, vamos criar um formatador que aplica um formato de “EEE, MMM d aaaa”. Esse formato especifica três caracteres para o nome do dia inteiro da semana, um dígito para representar o dia do mês, três caracteres para representar o mês e quatro dígitos para representar o ano.
Este formatador reconhece strings como “Fri, 3 Jan 2003″ or “Wed, 23 Mar 1994“:
String dateInString = "Mon, 05 May 1980";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, d MMM yyyy", Locale.ENGLISH);
LocalDate dateTime = LocalDate.parse(dateInString, formatter);
2.3. Padrões comuns de data e hora
Vejamos alguns padrões comuns de data e hora:
-
y – Ano (1996; 96)
-
M – Mês do ano (julho; julho; 07)
-
d - Dia do mês (1-31)
-
E - nome do dia na semana (sexta, domingo)
-
a– Marcador am / pm (AM, PM)
-
H - hora do dia (0-23)
-
h - horas em am / pm (1-12)
-
m - Minuto na hora (0-60)
-
s - segundos no minuto (0-60)
Para obter uma lista completa de símbolos que podemos usar para especificar um padrão de análise, clique emhere.
Se precisarmos converter as datasjava.time no objetojava.util.Date mais antigo, leia o artigothis para obter mais detalhes.
3. ConvertendoString emjava.util.Date
Before Java 8, the Java date and time mechanism was provided by the old APIs of java.util.Date, java.util.Calendar, and java.util.TimeZone classes com os quais às vezes ainda precisamos trabalhar.
Vamos ver como converter uma String em um objetojava.util.Date:
SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH);
String dateInString = "7-Jun-2013";
Date date = formatter.parse(dateInString);
No exemplo acima,we first need to construct a SimpleDateFormat object passando o padrão que descreve o formato de data e hora.
Em seguida, precisamos invocar o métodoparse() passando a dataString. Se o argumentoString passado não estiver no mesmo formato do padrão, umParseException será lançado.
3.1. Adicionando informações de fuso horário ajava.util.Date
It’s important to note that the java.util.Date has no concept of time zone, e representa apenas o número de segundos decorridos desde a época do Unix - 1970-01-01T00: 00: 00Z.
Mas, quando imprimimos o objetoDate diretamente, ele sempre será impresso com o fuso horário padrão do sistema Java.
Neste exemplo final, veremos como formatar uma data, adicionando informações de fuso horário:
SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a", Locale.ENGLISH);
formatter.setTimeZone(TimeZone.getTimeZone("America/New_York"));
String dateInString = "22-01-2015 10:15:55 AM";
Date date = formatter.parse(dateInString);
String formattedDateString = formatter.format(date);
Também podemos alterar o fuso horário da JVM programaticamente, mas isso não é recomendado:
TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
4. Bibliotecas externas
Agora que temos um bom entendimento de como converter objetosString em objetosDate usando as APIs novas e antigas oferecidas pelo Java principal, vamos dar uma olhada em algumas bibliotecas externas.
4.1. Biblioteca Joda-Time
Uma alternativa para a biblioteca Java principalDateeTime éJoda-Time. Embora os autores agora recomendem que os usuários migrem parajava.time (JSR-310), se isso não for possível, oJoda-Time library provides an excellent alternative for working with Date and Time. Esta biblioteca fornece praticamente todos os recursos suportados no projeto Java 8Date Time.
O artefato pode ser encontrado emMaven Central:
joda-time
joda-time
2.10
Aqui está um exemplo rápido de trabalho com oDateTime padrão:
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
String dateInString = "07/06/2013 10:11:59";
DateTime dateTime = DateTime.parse(dateInString, formatter);
Vejamos também um exemplo de configuração explícita de um fuso horário:
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
String dateInString = "07/06/2013 10:11:59";
DateTime dateTime = DateTime.parse(dateInString, formatter);
DateTime dateTimeWithZone = dateTime.withZone(DateTimeZone.forID("Asia/Kolkata"));
4.2. Apache Commons Lang - DateUtils
A classeDateUtils fornece muitosuseful utilities making it easier to work with the legacy Calendar and Date objects.
O artefato commons-lang3 está disponível emMaven Central:
org.apache.commons
commons-lang3
3.7
Vamos converter uma dataString usando umArray de padrões de data em umjava.util.Date:
String dateInString = "07/06-2013";
Date date = DateUtils.parseDate(dateInString,
new String[] { "yyyy-MM-dd HH:mm:ss", "dd/MM-yyyy" });
5. Conclusão
Neste artigo, ilustramos várias maneiras de converter Strings em diferentes tipos de objetosDate (com e sem tempo), tanto em Java puro quanto usando bibliotecas externas.
O código-fonte completo do artigo está disponívelover on GitHub.