[JAVA] : Dates, Instante, ZonedDateTime, LocalDateTime…. E agora?
A forma de trabalhar com datas na linguagem Java mudou nos últimos anos, o pacote mais utilizado foi o java.util, e muitas aplicações ainda o utilizam. A partir da versão 8, o java.util caiu em uso obsoleto em favor do java.time, que inclui recursos para aumentar a produtividade.
A tabela abaixo mostra um pequeno guia para a migração.
Sobre isso, mostrarei alguns exemplos de como usar a nova classe.
String Date To ZonedDateTime
import java.time.*;
import java.time.format.DateTimeFormatter;
public class StringToZonedDateTime {
public static void main(String args[]) {
//Format can be change by necessity
final String initialStringDate = "12/09/2021 00:00:00";
final String finalStringDate = "13/09/2021 00:00:00";
//LocalDateTime its a midle chanel for conversion
LocalDateTime initialLocalDate = LocalDateTime.parse(
initialStringDate,
DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss") //Obey the format from your String date
);
LocalDateTime finalLocalDate = LocalDateTime.parse(
finalStringDate,
DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss")
);
//Here we are used the UTC TimeZone
//But if we use TimeZone America/Sao_Paulo the ZonedDateTime plus 3 hours in the Date automatically
ZonedDateTime initialZonedDateTime = ZonedDateTime.of(initialLocalDate, ZoneId.of("UTC"));
ZonedDateTime finalZonedDateTime = ZonedDateTime.of(finalLocalDate, ZoneId.of("UTC"));
//Convert to Human
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy - HH:mm:ss Z");
String formattedString = initialZonedDateTime.format(formatter);
String formattedString2 = finalZonedDateTime.format(formatter);
System.out.println(formattedString);
System.out.println(formattedString2);
}
}
Add Time To ZonedDateTime
import java.time.*;
import java.time.format.DateTimeFormatter;
public class AddTimeToZonedDateTime {
public static void main(String args[]) {
//Format can be change by necessity
final String myStringDate = "12/09/2021 00:00:00";
//LocalDateTime its a midle chanel for conversion
LocalDateTime myLocalDateTime = LocalDateTime.parse(
myStringDate,
DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss") //Formato o Obedece a entrada String
);
//Transforming String date to ZonedDateTime
ZonedDateTime initialZonedTime = ZonedDateTime.of(myLocalDateTime, ZoneId.of("UTC"));
//Instante has a function for convert based on epochSecond (Long value)
Instant myInstanteDate = Instant.ofEpochSecond(initialZonedTime.toEpochSecond() + 3600);
ZonedDateTime myZonedTimeWithMore1Hour = ZonedDateTime.ofInstant(myInstanteDate, ZoneId.of("UTC"));
//Convert for Human
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy - HH:mm:ss Z");
String formattedString = myZonedTimeWithMore1Hour.format(formatter);
System.out.println(formattedString);
}
}
Nesta tabela podemos ver alguns valores para Epoch Time
Conclusão
Em geral, java.time tem várias funções. Ele vem com uma proposta bem interessante de ter funções mais semânticas, mais performatícas e melhor calculo de tempo. Apesar de não serem abordadas aqui, muitas outras funções facilitam o dia a dia, como:
//Comparetors
ZonedDateTime.isAfter()
ZonedDateTime.isBefore()
ZonedDateTime.isAfter()
//Substract
ZonedDateTime.minusHours()
ZonedDateTime.minusWeeks()
//Plus
ZonedDateTime.plusHours()
ZonedDateTime.plusWeeks()
Você pode ver mais detalhes em:
Oracle Documentation