Wraz z wersją 8 Java zyskała nowe API daty i godziny. Dotychczasowe klasy do zarządzania czasem takie jak GergorianCalendar, Date, Calendar są już niezalecane do wykorzystywania. Wiele metod z nich zostało opatrzone adnotacją @Deprecated. Nowe API dostarcza metody zalecane do użytku. Oczywiście istnieje pełna zgodność miedzy nowym a starym API. Można swobodnie dokonywać konwersji miedzy wszystkimi typami.
Poniżej lista podstawowych klas które weszły wraz z Java 8.
• Instant – bieżący czas liczony od 01-01-1970;
• LocalDate – reprezentacja daty w postaci rok-miesiąc-dzień;
• LocalTime – reprezentacja czasu w postaci godzina-minuta-sekunda;
• LocalDateTime – reprezentacja czasu w postaci rok-miesiąc-dzień-godzina-minuta-sekunda;
• DateTimeFormatter – wyrażenie regularne prezentujące datę;
• Year – reprezentacja roku;
• YearMonth – reprezentacja roku i miesiąca;
• DayOfWeek – enum z dniami tygodnia;
• Month – enum z dniami miesiąca;
• Duration – sekundowa reprezentacja casu;
• Clock – aktualna data, godzina i strefa czasowa;
Przypadki użycia i konwersje
Aktualny zapis dat:
String date = 2005-05-12; DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-mm-dd"); LocalDate dt = dtf.parseLocalDate(date);
Z nowego API do starego
LocalDateTime dateTime = LocalDateTime.of(2002, Month.MARCH, 1, 1, 1); Instant instant = dateTime.atZone(ZoneId.systemDefault()).toInstant(); Date date = Date.from(instant);
LocalDate localDate = LocalDate.of(2002, Month.JANUARY, 2); Instant instant = localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant(); Date date = Date.from(instant);
LocalTime localTime = LocalTime.now() Instant instant =localTime.atDate(LocalDate.of(A_YEAR, A_MONTH, A_DAY)).atZone(ZoneId.systemDefault()).toInstant(); Date date = Date.from(instant);
Z staregonowego API do nowego
Date date = new Date(0); Instant instant = Instant.ofEpochMilli(date.getTime()); LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
Date date = new Date(0); Instant instant = Instant.ofEpochMilli(date.getTime()); LocalDate localDate = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalDate();
Date date = new Date(0); Instant instant = Instant.ofEpochMilli(date.getTime()); LocalTime localTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalTime();