DEV Community

Cover image for Working with Dates - Java 8+
Joao Carlos Sousa do Vale
Joao Carlos Sousa do Vale

Posted on

Working with Dates - Java 8+

Hints using Dates for Java

Category Description Classes
Local dates and times Represents the local time zone java.time.LocalDate, java.time.LocalTime, java.time.LocalDateTime
Zoned dates and times These dates and times include time-zone information java.time.ZonedDateTime, java.time.OffsetDateTime
Formatters for dates and times To parse and print dates and times with patterns and in a variety of styles java.time.format.DateTimeFormatter
Adjustments to dates and times To adjust and manipulate dates and times by handy increments java.time.temporal.TemporalAdjusters, java.time.temporal.ChronoUnit
Periods, Durations, and Instants To represent an amount of time, periods for days or longer and durations for shorter periods like minutes or seconds, as a specific instant in time java.time.Periods, java.time.Durations, java.time.Instants
  • you need to avoid to use java.util.Date, java.util.Calendar, java.text.DateFormat. They are considered old.

The java.time.* Classes for Dates and Times

  • uses the static method LocalDate.now() to get the current date;
  • uses the static method LocalTime.now() to get the current time;
  • uses the static method LocalDate.of() to generate a DateTime;
import java.time.LocalDate;  
import java.time.LocalDateTime;  
import java.time.LocalTime;  

public class InstanciandoDatas {  

    public static void main(String[] args) {  
        LocalDate data = LocalDate.now();
        LocalTime horario = LocalTime.now();

        LocalDateTime dataHora = LocalDateTime.of(data, horario);
        System.out.println("Data e hora usando LocalDateTime.of(data, horario): " + dataHora);

        dataHora = LocalDateTime.now();
        System.out.println("Data e hora usando LocalDateTime.now(): " + dataHora);  
    }  
}
Enter fullscreen mode Exit fullscreen mode
Data e hora usando LocalDateTime.of(data, horario): 2022-05-04T18:32:49.130299600
Data e hora usando LocalDateTime.now(): 2022-05-04T18:32:49.132294300
Enter fullscreen mode Exit fullscreen mode
  • to generate custom dates and times:
    • LocalDate.of(YYYY, MM, DD)
    • LocalDate.parse("YYYY-MM-DD")
    • LocalTime.of(hh, mm, ss)
    • LocalDate.parse("hh:mm:ss")
    • LocalDateTime.of(YYYY, MM, DD, hh, mm, ss)
    • LocalDate.parse("YYYY-MM-DDThh:mm:ss")
import java.time.LocalDate;
import java.time.LocalTime;

public class DatasCustomizadas {

    public static void main(String[] args) {
        LocalDate dataInicio = LocalDate.of(2022, 01, 01);
        LocalDate dataFim = LocalDate.parse("2022-01-30");
        System.out.println("Ferias de " + dataInicio + " ate " + dataFim);

        LocalTime horaInicio = LocalTime.of(8,15,30);
        LocalTime horaFim = LocalTime.parse("09:47:55");
        System.out.println("Intervalo de " + horaInicio + " ate " + horaFim);

        LocalDateTime dataHoraInicio = LocalDateTime.of(2022, 12,15, 1, 22, 43);
        LocalDateTime dataHoraFim = LocalDateTime.parse("2022-12-20T05:45:43");
        System.out.println("Recesso de " + dataHoraInicio + " ate " + dataHoraFim);    }   
}
Enter fullscreen mode Exit fullscreen mode
Ferias de 2022-01-01 ate 2022-01-30
Intervalo de 08:15:30 ate 09:47:55
Recesso de 2022-12-15T01:22:43 ate 2022-12-20T05:45:43
Enter fullscreen mode Exit fullscreen mode
  • we can use the DateTimeFormatter to be used as date time formatter to read a string or to generate a string from a date time.
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class FormatandoDatas {

    public static void main(String[] args) {
        String strDataFormatoBR = "25-06-1980 11:15";
        DateTimeFormatter formatoData = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
        LocalDateTime dataHoraBR = LocalDateTime.parse(strDataFormatoBR, formatoData);
        System.out.println("Data e hora extraidos do formato BR: " + dataHoraBR);

        DateTimeFormatter outroFormato = DateTimeFormatter.ofPattern("dd MM yy - HH, mm");
        System.out.println("Outros formatos: " + dataHoraBR.format(outroFormato));
    }
}
Enter fullscreen mode Exit fullscreen mode
Data e hora extraidos do formato BR: 1980-06-25T11:15
Outros formatos: 25 06 80 - 11, 15
Enter fullscreen mode Exit fullscreen mode
  • LocalDateTime has several methods that make it easy to add to and subtract from dates and times. Like .plusHours(), .plusDays(), .plusMinutes(), plusYears(), minusWeeks(), minusSeconds(), etc.
  • And useful methods like .getDayOfWeek().
import java.time.LocalDate;

public class ManipulandoDatas {

    public static void main(String[] args) {
        LocalDate dataNascimento = LocalDate.of(1980, 6, 25);
        System.out.println("Dia da Semana: " + dataNascimento.getDayOfWeek());
        System.out.println("Três dias antes: " + dataNascimento.minusDays(3));
        System.out.println("Três dias depois: " + dataNascimento.plusDays(3));
    }
}
Enter fullscreen mode Exit fullscreen mode
Dia da Semana: WEDNESDAY
Três dias antes: 1980-06-22
Três dias depois: 1980-06-28
Enter fullscreen mode Exit fullscreen mode

Zoned Dates and Times

  • all time zones are based on Greenwich Mean Time (GMT);
  • The name of the time standard that uses GMT as the basis for all other time zones is Coordinated Universal Time (UTC);
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class DataComFuso {

    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.now();

        ZonedDateTime zonedDateTimeSP = ZonedDateTime.of(dateTime, ZoneId.of("America/Sao_Paulo"));
        ZonedDateTime zonedDateTimeAC = ZonedDateTime.of(dateTime, ZoneId.of("Brazil/Acre"));
        ZonedDateTime zonedDateTimePT = ZonedDateTime.of(dateTime, ZoneId.of("Europe/Lisbon"));

        System.out.println("Data hora fuso SP: " + zonedDateTimeSP);
        System.out.println("Data hora fuso AC: " + zonedDateTimeAC);
        System.out.println("Data hora fuso PT: " + zonedDateTimePT);
    }
}
Enter fullscreen mode Exit fullscreen mode
Data hora fuso SP: 2022-05-05T00:34:41.243321900-03:00[America/Sao_Paulo]
Data hora fuso AC: 2022-05-05T00:34:41.243321900-05:00[Brazil/Acre]
Data hora fuso PT: 2022-05-05T00:34:41.243321900+01:00[Europe/Lisbon]
Enter fullscreen mode Exit fullscreen mode
  • The names of the zones are not listed in the documentation page for ZoneId, but you can use this reference
  • You can find out if you’re in daylight savings time by using ZoneRules.
    • .isDaylightSavings() using an Instant
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class HorarioDeVerao {

    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.parse("2018-05-01T05:00:00");
        ZoneId zoneId = ZoneId.of("America/Sao_Paulo");
        ZonedDateTime zonedDateTimeSP = ZonedDateTime.of(dateTime, zoneId);

        boolean isDaylightSaving = zoneId.getRules().isDaylightSavings(zonedDateTimeSP.toInstant());
        System.out.println("Em " + zonedDateTimeSP + " SP esta em horario de verao: " + isDaylightSaving);

        dateTime = LocalDateTime.parse("2018-12-01T05:00:00");
        zonedDateTimeSP = ZonedDateTime.of(dateTime, zoneId);
        isDaylightSaving = zoneId.getRules().isDaylightSavings(zonedDateTimeSP.toInstant());
        System.out.println("Em " + zonedDateTimeSP + " SP esta em horario de verao: " + isDaylightSaving);
    }
}
Enter fullscreen mode Exit fullscreen mode

Date and Time Adjustments

  • datetime objects as “immutable.
  • it is possible to use adjusters, like TemporalAdjusters, in a datetime to create new ones.
    • firstDayOfNextYear()
    • lastDayOfMonth()
    • withHour()
    • withYear()
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.TemporalAdjusters;

public class AjustandoDatas {

    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.parse("2018-05-01T05:00:00");
        ZonedDateTime zonedDateTimeSP = ZonedDateTime.of(dateTime, ZoneId.of("America/Sao_Paulo"));
        System.out.println("O dia " + zonedDateTimeSP + " foi no dia da semana: " + zonedDateTimeSP.getDayOfWeek());

        ZonedDateTime nextFridayDateTime = zonedDateTimeSP.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
        System.out.println("A data da proxima SEXTA foi: " + nextFridayDateTime);
    }
}
Enter fullscreen mode Exit fullscreen mode
O dia 2018-05-01T05:00-03:00[America/Sao_Paulo] foi no dia da semana: TUESDAY
A data da proxima SEXTA foi: 2018-05-04T05:00-03:00[America/Sao_Paulo]
Enter fullscreen mode Exit fullscreen mode
  • when we don't need to modify a date considering the zone rules, we need to use the OffsetDateTime

Periods, Durations, and Instants

  • Periods represents a period of days, months, or years;
  • Durations represents a short period of minutes or hours
  • Instant represents an intant in time.
    • the number of seconds (and nanoseconds) since January 1, 1970
import java.time.Period;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class UsandoPeriodosDeTempo {

    public static void main(String[] args) {
        ZonedDateTime startDateTime = ZonedDateTime.of(2022, 4, 8, 13, 35, 56, 0, ZoneId.of("America/Sao_Paulo"));

        Period period = Period.ofMonths(3);
        ZonedDateTime endDateTime = startDateTime.plus(period);

        System.out.println("Inicio da Atividade: " + startDateTime);
        System.out.println("Fim da Atividade (+ 3 meses): " + endDateTime);

        System.out.println("\nFim da Atividade com horario de Portugal: " + endDateTime.withZoneSameInstant(ZoneId.of("Europe/Lisbon")));
    }
}
Enter fullscreen mode Exit fullscreen mode
Inicio da Atividade: 2022-04-08T13:35:56-03:00[America/Sao_Paulo]
Fim da Atividade (+ 3 meses): 2022-07-08T13:35:56-03:00[America/Sao_Paulo]

Fim da Atividade com horario de Portugal: 2022-07-08T17:35:56+01:00[Europe/Lisbon]
Enter fullscreen mode Exit fullscreen mode
import java.time.Duration;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;

public class DuracaoDeIntervalo {

    public static void main(String[] args) {
        LocalTime begins = LocalTime.of(12, 07, 10);
        LocalTime ends = LocalTime.of(14, 22, 37);
        System.out.println("Intervalo: " + begins + " - " + ends);

        long minutes = ChronoUnit.MINUTES.between(begins, ends);
        System.out.println("Total minutos: " + begins + " - " + ends);

        Duration duration = Duration.ofMinutes(minutes);
        System.out.println("Duracao do intervalo: " + duration);
    }
}
Enter fullscreen mode Exit fullscreen mode
Intervalo: 12:07:10 - 14:22:37
Total minutos: 12:07:10 - 14:22:37
Duracao do intervalo: PT2H15M
Enter fullscreen mode Exit fullscreen mode
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class UsandoInstant {

    public static void main(String[] args) {
        ZonedDateTime eventDateTime = ZonedDateTime.of(1998, 1, 13, 16, 45, 56, 0, ZoneId.of("America/Sao_Paulo"));
        Instant eventInstant = eventDateTime.toInstant();
        System.out.println("Data e hora do evento: " + eventDateTime);
        System.out.println("Instante do evento: " + eventInstant);

        System.out.println("\nNumero de segundos de 01-Janeiro-1970 ate o inicio do evento: " + eventInstant.getEpochSecond());
    }
}
Enter fullscreen mode Exit fullscreen mode
Data e hora do evento: 1998-01-13T16:45:56-02:00[America/Sao_Paulo]
Instante do evento: 1998-01-13T18:45:56Z

Numero de segundos de 01-Janeiro-1970 ate o inicio do evento: 884717156
Enter fullscreen mode Exit fullscreen mode

Using Dates and Times with Locales

  • the DateTimeFormatter class can use an instance of Locale to customize formatted output for a specific locale
  • The API says a locale is “a specific geographical, political, or cultural region”.
Locale(String language)
Locale(String language, String country)
Enter fullscreen mode Exit fullscreen mode
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Locale;

public class UsandoLocale {

    public static void main(String[] args) {
        Locale locBR = new Locale("pt", "BR");
        Locale locJA = new Locale("ja");
        Locale locUS = new Locale("US");


        ZonedDateTime zonedDateTime = ZonedDateTime.now();

        System.out.println("Formato longo: ");
        System.out.println("Brasil: " +
                zonedDateTime.format(
                        DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
                                .withLocale(locBR)));
        System.out.println("Japao: " +
                zonedDateTime.format(
                        DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
                                .withLocale(locJA)));
        System.out.println("USA: " +
                zonedDateTime.format(
                        DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
                                .withLocale(locUS)));

        System.out.println("\nFormato curto: ");
        System.out.println("Brasil: " +
                zonedDateTime.format(
                        DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
                                .withLocale(locBR)));
        System.out.println("Japao: " +
                zonedDateTime.format(
                        DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
                                .withLocale(locJA)));
        System.out.println("USA: " +
                zonedDateTime.format(
                        DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
                                .withLocale(locUS)));
    }
}
Enter fullscreen mode Exit fullscreen mode
Formato longo: 
Brasil: 5 de maio de 2022 13:14:16 CEST
Japao: 2022年5月5日 13:14:16 CEST
USA: 2022 May 5 13:14:16 CEST

Formato curto: 
Brasil: 05/05/2022 13:14
Japao: 2022/05/05 13:14
USA: 2022-05-05 13:14
Enter fullscreen mode Exit fullscreen mode

SUMMARY

  • main methods
java.time Class method example
LocalDate LocalDate.now();
LocalDate.of(2022, 8, 22);
LocalDate.parse("2022-8-22");
LocalTime LocalTime.now();
LocalTime.of(11, 20, 37);
LocalTime.of("11:20:37");
LocalDateTime LocalDateTime.now();
LocalDateTime.of(aDate, aTime);
LocalDateTime.parse("2022-05-09T11:20:37");
LocalDateTime.parse(aDateTime, aFormatter);
LocalDateTime.parse("2022-09-22T11:20", aFormatter);
ZonedDateTime ZonedDateTime.now();
ZonedDateTime.of(aDateTime, ZoneId.of(aZoneString));
ZonedDateTime.parse("2018-05-09T11:20:47-03:00")
OffsetDateTime OffsetDateTime.now();
OffsetDateTime.of(aDateTime, ZoneOffset.of("-03:00"));
OffsetDateTime.parse("2018-04-08T11:19:36-03:00");
format.DateTimeFormatter DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(aLocale);
Instant Instant.now()
zonedDateTime.toInstant();
aDateTime.toInstant(ZoneOffset.of("+5"));
Duration Duration.between(aDate1, aDate2);
Duration.ofMinutes(5);
Period Period.between(aDate1, aDate2);
Period.ofDays(3);
util.Locale Locale.getDefault();
new Locale(String language);
new Locale(String language, String country);
java.time Class adjustment example
LocalDate aDate.minusDays(3);
aDate.plusWeeks(1);
aDate.withYear(2018);
LocalTime aTime.minus(3, ChronoUnit.MINUTES);
aTime.plusMinutes(3);
aTime.withHour(12);
LocalDateTime aDateTime.minusDays(3);
aDateTime.plusMinutes(10);
aDateTime.plus(Duration.ofMinutes(5));
aDateTime.withMonth(2);
ZonedDateTime zonedDateTime.withZoneSameInstant(ZoneId.of("US/Pacific"));

REFERENCES

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/format/DateTimeFormatter.html

https://mkyong.com/java8/java-display-all-zoneid-and-its-utc-offset/

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/package-summary.html

Discussion (0)