Overfører til den nye Java 8 Date Time API

1. Oversikt

I denne opplæringen lærer du hvordan du kan omforme koden din for å utnytte den nye Date Time API introdusert i Java 8.

2. Ny API på et øyeblikk

Å jobbe med datoer i Java pleide å være vanskelig. Det gamle datobiblioteket levert av JDK inkluderte bare tre klasser: java.util.Date, java.util.Kalender og java.util.Timezone.

Disse var bare egnet for de mest grunnleggende oppgavene. For noe som er eksternt komplekst, måtte utviklerne enten bruke tredjepartsbiblioteker eller skrive tonnevis med tilpasset kode.

Java 8 introduserte et helt nytt Date Time API (java.util.time. *) som er løst basert på det populære Java-biblioteket kalt JodaTime. Denne nye API-en forenklet dramatisk behandling av dato og klokkeslett og løste mange mangler ved det gamle datobiblioteket.

1.1. API-klarhet

En første fordel med den nye API-en er klarhet - API er veldig tydelig, kortfattet og lett å forstå. Det har ikke mange uoverensstemmelser som finnes i det gamle biblioteket, for eksempel feltnummerering (i kalendermånedene er nullbaserte, men ukedagene er enbaserte).

1.2. API-fleksibilitet

En annen fordel er fleksibilitet - arbeider med flere representasjoner av tid. Det gamle datobiblioteket inkluderte bare en enkelt representasjonsklasse - java.util.Date, som til tross for navnet faktisk er en tidsstempel. Den lagrer bare antall millisekunder som har gått siden Unix-epoken.

Den nye API-en har mange forskjellige tidsrepresentasjoner, som hver passer for forskjellige bruksområder:

  • Umiddelbar - representerer et tidspunkt (tidsstempel)
  • LocalDate - representerer en dato (år, måned, dag)
  • LocalDateTime - samme som LocalDate, men inkluderer tid med nanosekund presisjon
  • OffsetDateTime - samme som LocalDateTime, men med tidsforskyvning
  • Lokal tid - tid med nanosekund presisjon og uten datoinformasjon
  • ZonedDateTime - samme som OffsetDateTime, men inkluderer en tidssone-ID
  • OffsetLocalTime - samme som Lokal tid, men med tidsforskyvning
  • Måned dag - måned og dag, uten år eller tid
  • ÅrMåned - måned og år, uten dag eller tid
  • Varighet - mengden tid representert i sekunder, minutter og timer. Har nanosekund presisjon
  • Periode - mengden tid representert i dager, måneder og år

1.3. Uforanderlighet og trådsikkerhet

En annen fordel er at all tid representasjoner i Java 8 Date Time API er uforanderlig og dermed trådsikker.

Alle mutasjonsmetoder returnerer en ny kopi i stedet for å endre tilstanden til det opprinnelige objektet.

Gamle klasser som java.util.Date var ikke trådsikre og kunne introdusere svært subtile samtidige feil.

1.4. Metodekjetting

Alle mutasjonsmetoder kan lenkes sammen, slik at komplekse transformasjoner kan implementeres i en enkelt kodelinje.

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

2. Eksempler

Eksemplene nedenfor vil demonstrere hvordan du utfører vanlige oppgaver med både gammel og ny API.

Få aktuell tid

// Gammel dato nå = ny dato (); // Ny ZonedDateTime nå = ZonedDateTime.now (); 

Representerer spesifikk tid

// Old Date birthDay = new GregorianCalendar (1990, Calendar. DESEMBER, 15) .getTime (); // Ny LocalDate fødselsdag = LocalDate.of (1990, måned. DESEMBER, 15); 

Pakke ut spesifikke felt

// Old int month = new GregorianCalendar (). Get (Calendar.MONTH); // Ny måned måned = LocalDateTime.now (). GetMonth (); 

Legge til og trekke fra tid

// Gammel gregoriansk kalenderkalender = ny gregoriansk kalender (); calendar.add (Calendar.HOUR_OF_DAY, -5); Dato fiveHoursBefore = calendar.getTime (); // Ny LocalDateTime fiveHoursBefore = LocalDateTime.now (). MinusHours (5); 

Endring av spesifikke felt

// Gammel gregoriansk kalenderkalender = ny gregoriansk kalender (); calendar.set (Calendar.MONTH, Calendar.JUNE); Dato inJuni = calendar.getTime (); // Ny LocalDateTime inJune = LocalDateTime.now (). MedMonth (Måned.JUNE.getValue ()); 

Avkuttende

Avkorting tilbakestiller alle tidsfelt som er mindre enn det angitte feltet. I eksemplet nedenfor vil minutter og alt nedenfor bli satt til null

// Old Calendar now = Calendar.getInstance (); now.set (Calendar.MINUTE, 0); now.set (Calendar.SECOND, 0); now.set (Calendar.MILLISECOND, 0); Avkortet dato = now.getTime (); // New LocalTime truncated = LocalTime.now (). TruncatedTo (ChronoUnit.HOURS); 

Konvertering av tidssone

// Gammel gregoriansk kalenderkalender = ny gregoriansk kalender (); calendar.setTimeZone (TimeZone.getTimeZone ("CET")); Dato centralEastern = calendar.getTime (); // Ny ZonedDateTime centralEastern = LocalDateTime.now (). AtZone (ZoneId.of ("CET")); 

Å få tidsperiode mellom to tidspunkter

// Gammel gregoriansk kalenderkalender = ny gregoriansk kalender (); Dato nå = ny dato (); calendar.add (Calendar.HOUR, 1); Dato hourLater = calendar.getTime (); lang forløpt = hourLater.getTime () - now.getTime (); // Ny LocalDateTime nå = LocalDateTime.now (); LocalDateTime hourLater = LocalDateTime.now (). PlusHours (1); Varighet span = Duration.between (now, hourLater); 

Tidsformatering og parsing

DateTimeFormatter er en erstatning for den gamle SimpleDateFormat som er trådsikker og gir ekstra funksjonalitet.

// Gammel SimpleDateFormat dateFormat = ny SimpleDateFormat ("åååå-MM-dd"); Dato nå = ny dato (); Streng formattedDate = dateFormat.format (nå); Date parsedDate = dateFormat.parse (formattedDate); // Ny LocalDate nå = LocalDate.now (); DateTimeFormatter formatter = DateTimeFormatter.ofPattern ("åååå-MM-dd"); Streng formattedDate = now.format (formatter); LocalDate parsedDate = LocalDate.parse (formattedDate, formatter); 

Antall dager i en måned

// Gammel kalenderkalender = ny gregoriansk kalender (1990, kalender. FEBRUAR, 20); int daysInMonth = calendar.getActualMaximum (Calendar.DAY_OF_MONTH); // Nye int-dagerInMonth = YearMonth.of (1990, 2) .lengthOfMonth ();

3. Samhandle med Legacy Code

I mange tilfeller kan en bruker trenge å sikre interoperabilitet med tredjepartsbiblioteker som er avhengige av det gamle datobiblioteket.

I Java 8 er gamle datobiblioteksklasser utvidet med metoder som konverterer dem til tilsvarende objekter fra nytt Date API.

Nye klasser gir lignende funksjoner.

Øyeblikkelig instantFromCalendar = GregorianCalendar.getInstance (). ToInstant (); ZonedDateTime zonedDateTimeFromCalendar = ny gregoriansk kalender (). ToZonedDateTime (); Date dateFromInstant = Date.from (Instant.now ()); GregorianCalendar calendarFromZonedDateTime = GregorianCalendar.from (ZonedDateTime.now ()); Øyeblikkelig instantFromDate = ny dato (). TilInstant (); ZoneId zoneIdFromTimeZone = TimeZone.getTimeZone ("PST"). ToZoneId (); 

4. Konklusjon

I denne artikkelen undersøkte vi den nye Date Time API tilgjengelig i Java 8. Vi så på fordelene, sammenlignet med den avviklede APIen, og påpekte forskjeller ved å bruke flere eksempler.

Vær oppmerksom på at vi knapt klødde overflaten av funksjonene til den nye Date Time API. Sørg for å lese gjennom den offisielle dokumentasjonen for å oppdage hele spekteret av verktøy som tilbys av den nye API-en.

Kodeeksempler finnes i GitHub-prosjektet.


$config[zx-auto] not found$config[zx-overlay] not found