Áttérés az Új Java 8 dátum és idő API-ra

1. Áttekintés

Ebben az oktatóanyagban megtudhatja, hogyan kell átalakítani a kódot annak érdekében, hogy kihasználja a Java 8-ban bevezetett új dátum és idő API-t.

2. Új API egy pillantásra

A dátumokkal való munka Java-ban régen nehéz volt. A JDK által biztosított régi dátumkönyvtár csak három osztályt tartalmazott: java.util.Date, java.util.Calendar és java.util.Timezone.

Ezek csak a legalapvetőbb feladatokra voltak alkalmasak. Bármi, ami távolról is összetett, a fejlesztőknek vagy harmadik fél könyvtárait kellett használniuk, vagy rengeteg egyedi kódot kellett írniuk.

A Java 8 egy teljesen új Date Time API-t vezetett be (java.util.time. *), amely lazán a JodaTime nevű népszerű Java könyvtáron alapul. Ez az új API drámai módon leegyszerűsítette a dátum és idő feldolgozását, és kijavította a régi dátumkönyvtár számos hiányosságát.

1.1. API Clarity

Az új API első előnye az világosság - az API nagyon világos, tömör és könnyen érthető. Nincs sok inkonzisztenciája a régi könyvtárban, például a mezők számozása (a Naptár hónapjai nulla alapúak, de a hét napjai egy alapúak).

1.2. API rugalmasság

További előny a rugalmasság - az idő több reprezentációjával dolgozni. A régi dátumkönyvtár csak egyetlen időbeli reprezentációs osztályt tartalmazott - java.util.Dátum, amely a neve ellenére valójában időbélyeg. Csak a Unix-korszak óta eltelt milliszekundumok számát tárolja.

Az új API sok különböző időbeli ábrázolással rendelkezik, amelyek mindegyike különböző felhasználási esetekre alkalmas:

  • Azonnali - egy időpontot jelöl (időbélyeg)
  • LocalDate - dátumot jelöl (év, hónap, nap)
  • LocalDateTime - ugyanaz, mint a LocalDate, de nanoszekundum pontossággal tartalmazza az időt
  • OffsetDateTime - ugyanaz, mint a LocalDateTime, de az időzóna eltolásával
  • Helyi idő - idő nanoszekundum pontossággal és dátuminformációk nélkül
  • ZonedDateTime - ugyanaz, mint a OffsetDateTime, de tartalmaz egy időzóna azonosítót
  • OffsetLocalTime - ugyanaz, mint a Helyi idő, de az időzóna eltolásával
  • Hónap nap - hónap és nap, év vagy idő nélkül
  • ÉvHónap - hónap és év, nap vagy idő nélkül
  • Időtartam - másodpercekben, percekben és órákban ábrázolt időtartam. Nanomásodperces pontossággal rendelkezik
  • Időszak - a napokban, hónapokban és években megadott időtartam

1.3. Változatlanság és szálbiztonság

További előny, hogy a Java 8 Date Time API minden időbeli reprezentációja megváltoztathatatlan és így menetbiztos.

Minden mutációs módszer új példányt ad vissza az eredeti objektum állapotának módosítása helyett.

Régi osztályok, mint pl java.util.Dátum nem voltak biztonságosak a szálakban, és nagyon finom párhuzamossági hibákat mutathattak be.

1.4. Módszer láncolás

Minden mutációs módszer összekapcsolható, lehetővé téve a bonyolult átalakításokat egyetlen kódsorban.

ZonedDateTime nextFriday = LocalDateTime.now () .plusHours (1) .with (TemporalAdjusters.next (DayOfWeek.FRIDAY)) .atZone (ZoneId.of ("PST")); 

2. Példák

Az alábbi példák bemutatják, hogyan lehet közös feladatokat végrehajtani mind a régi, mind az új API-val.

Az aktuális idő lekérése

// Régi dátum most = új dátum (); // New ZonedDateTime now = ZonedDateTime.now (); 

Konkrét idő ábrázolása

// Régi dátum születési nap = új Gergely-naptár (1990, Naptár. DECEMBER, 15.) .getTime (); // New LocalDate birthDay = LocalDate.of (1990, Hónap, DECEMBER, 15); 

Meghatározott mezők kibontása

// Régi int hónap = új GregorianCalendar (). Get (Naptár.HÓNAP); // Új hónap hónap = LocalDateTime.now (). GetMonth (); 

Idő összeadása és kivonása

// Régi GregorianCalendar naptár = new GregorianCalendar (); calendar.add (Naptár.HOUR_OF_DAY, -5); Date fiveHoursBefore = calendar.getTime (); // New LocalDateTime fiveHoursBefore = LocalDateTime.now (). MínuszHours (5); 

Meghatározott mezők módosítása

// Régi GregorianCalendar naptár = new GregorianCalendar (); calendar.set (Naptár.HÓNAP, Naptár.JÚNIUS); Date inJune = calendar.getTime (); // New LocalDateTime inJune = LocalDateTime.now (). WithMonth (Month.JUNE.getValue ()); 

Csonkító

A csonkolással a megadott mezőnél kisebb időmezők visszaállnak. Az alábbi példában percek alatt az összes nullára lesz állítva

// Régi naptár most = Calendar.getInstance (); now.set (Naptár.MINUTE, 0); now.set (Naptár.SECOND, 0); now.set (Naptár.MILLISECOND, 0); Csonka dátum = now.getTime (); // New LocalTime csonka = LocalTime.now (). TruncatedTo (ChronoUnit.HOURS); 

Időzóna átalakítás

// Régi GregorianCalendar naptár = new GregorianCalendar (); calendar.setTimeZone (TimeZone.getTimeZone ("CET")); Dátum centralEastern = calendar.getTime (); // Új ZonedDateTime centralEastern = LocalDateTime.now (). AtZone (ZoneId.of ("CET")); 

Két időpont közötti időtartam megszerzése

// Régi GregorianCalendar naptár = new GregorianCalendar (); Dátum most = új Dátum (); calendar.add (Naptár.HOUR, 1); Dátum hourLater = calendar.getTime (); hosszan eltelt = hourLater.getTime () - now.getTime (); // New LocalDateTime now = LocalDateTime.now (); LocalDateTime hourLater = LocalDateTime.now (). PlusHours (1); Időtartam = Duration.between (now, hourLater); 

Idő formázása és elemzése

A DateTimeFormatter a régi SimpleDateFormat helyettesítője, amely szálbiztos és további funkciókat biztosít.

// Régi SimpleDateFormat dateFormat = új SimpleDateFormat ("éééé-hh-nn"); Dátum most = új Dátum (); String formattedDate = dateFormat.format (most); Date parsedDate = dateFormat.parse (formattedDate); // New LocalDate now = LocalDate.now (); DateTimeFormatter formatter = DateTimeFormatter.ofPattern ("éééé-hh-nn"); String formattedDate = now.format (formázó); LocalDate parsedDate = LocalDate.parse (formattedDate, formatter); 

Napok száma egy hónapban

// Régi naptár-naptár = new GregorianCalendar (1990, Calendar. FEBRUARY, 20); int daysInMonth = naptár.getActualMaximum (Naptár.DAY_OF_MONTH); // New int daysInMonth = YearHonth.of (1990, 2) .lengthOfMonth ();

3. Interakció a régi kóddal

Sok esetben előfordulhat, hogy a felhasználónak biztosítania kell az interoperabilitást a régi dátumkönyvtárra támaszkodó külső könyvtárakkal.

A Java 8-ban a régi dátumkönyvtár osztályokat kibővítették olyan módszerekkel, amelyek átalakítják őket az új Date API megfelelő objektumává.

Az új osztályok hasonló funkciókat biztosítanak.

Instant instantFromCalendar = GregorianCalendar.getInstance (). ToInstant (); ZonedDateTime zonedDateTimeFromCalendar = new GregorianCalendar (). ToZonedDateTime (); Date dateFromInstant = Date.from (Instant.now ()); GregorianCalendar calendarFromZonedDateTime = GregorianCalendar.from (ZonedDateTime.now ()); Instant instantFromDate = new Date (). ToInstant (); ZoneId zoneIdFromTimeZone = TimeZone.getTimeZone ("PST"). ToZoneId (); 

4. Következtetés

Ebben a cikkben feltártuk a Java 8-ban elérhető új Date Time API-t. Megvizsgáltuk annak előnyeit az elavult API-hoz képest, és több példa segítségével rámutattunk a különbségekre.

Ne feledje, hogy alig karcoltuk meg az új Date Time API képességeinek felületét. Feltétlenül olvassa el a hivatalos dokumentációt, hogy felfedezze az új API által kínált eszközök teljes skáláját.

Kódpéldák találhatók a GitHub projektben.