Converteer Datum naar LocalDate of LocalDateTime en terug

1. Overzicht

Vanaf Java 8 hebben we een nieuwe Date API: java.time.

Soms moeten we echter nog conversies uitvoeren tussen de nieuwe en oude API's en werken met datumweergaven van beide.

2. Converteren java.util.Date naar java.time.LocalDate

Laten we beginnen met het converteren van de oude datumweergave naar de nieuwe.

Hier kunnen we profiteren van een nieuwetoInstant () methode, die is toegevoegd aan java.util.Date in Java 8.

Als we een Onmiddellijkobject, is het vereist om een ZoneId omdatOnmiddellijk objecten zijn tijdzone-agnostisch - alleen punten op de tijdlijn.

De atZone (ZoneId-zone) API van Onmiddellijk object retourneert een ZonedDateTime, dus we hoeven alleen maar te extraheren LocalDate van het met behulp van de toLocalDate () methode.

Ten eerste gebruiken we het standaardsysteem ZoneId:

openbare LocalDate convertToLocalDateViaInstant (Date dateToConvert) {return dateToConvert.toInstant () .atZone (ZoneId.systemDefault ()) .toLocalDate (); }

En een vergelijkbare oplossing, maar met een andere manier om een Onmiddellijk voorwerp - de ... gebruiken van EpochMilli () methode:

openbare LocalDate convertToLocalDateViaMilisecond (Date dateToConvert) {return Instant.ofEpochMilli (dateToConvert.getTime ()) .atZone (ZoneId.systemDefault ()) .toLocalDate (); }

Laten we, voordat we verder gaan, ook even kijken naar het oud java.sql.Datum class en hoe dat kan worden omgezet in een LocalDate ook.

Beginnend met Java 8, kunnen we een extra vinden toLocalDate () methode op java.sql.Datum, wat ons ook een gemakkelijke manier geeft om het om te zetten naar java.time.LocalDate.

In dit geval hoeven we ons geen zorgen te maken over de tijdzone:

openbare LocalDate convertToLocalDateViaSqlDate (Date dateToConvert) {retourneer nieuwe java.sql.Date (dateToConvert.getTime ()). toLocalDate (); }

Op dezelfde manier kunnen we een oud converteren Datum object in een LocalDateTime object ook. Laten we daar eens naar kijken.

3. Omzetten java.util.Date naar java.time.LocalDateTime

Om een LocalDateTime we kunnen bijvoorbeeld op dezelfde manier gebruiken een tussenpersoon ZonedDateTime en gebruik vervolgens de toLocalDateTime () API.

Net als voorheen kunnen we twee mogelijke oplossingen gebruiken om een Onmiddellijk bezwaar tegen java.util.Date:

openbare LocalDateTime convertToLocalDateTimeViaInstant (Date dateToConvert) {return dateToConvert.toInstant () .atZone (ZoneId.systemDefault ()) .toLocalDateTime (); } openbare LocalDateTime convertToLocalDateTimeViaMilisecond (Date dateToConvert) {return Instant.ofEpochMilli (dateToConvert.getTime ()) .atZone (ZoneId.systemDefault ()) .toLocalDateTime (); }

En vanaf Java 8 kunnen we dat ook gebruik java.sql.Timestamp om een LocalDateTime:

ocalDateTime convertToLocalDateTimeViaSqlTimestamp (Date dateToConvert) {retourneer nieuwe java.sql.Timestamp (dateToConvert.getTime ()). toLocalDateTime (); }

4. Omzetten java.time.LocalDate naar java.util.Date

Nu we een goed begrip hebben van hoe we van de oude gegevensweergave naar de nieuwe kunnen converteren, laten we eens kijken naar conversie in de andere richting.

We bespreken twee mogelijke manieren om te converteren LocalDate naar Datum.

In de eerste gebruiken we een nieuwe valueOf (LocalDate date) methode voorzien injava.sql.Datum object, dat duurt LocalDate als parameter:

openbare datum convertToDateViaSqlDate (LocalDate dateToConvert) {return java.sql.Date.valueOf (dateToConvert); }

Zoals we kunnen zien, is het moeiteloos en intuïtief. Het gebruikt de lokale tijdzone voor conversie (alles gebeurt onder de motorkap, dus u hoeft zich geen zorgen te maken).

In een ander Java 8-voorbeeld gebruiken we een Onmiddellijk object dat we doorgeven aan de van (Instant instant)methode vanjava.util.Date voorwerp:

openbare Datum convertToDateViaInstant (LocalDate dateToConvert) {return java.util.Date.from (dateToConvert.atStartOfDay () .atZone (ZoneId.systemDefault ()) .toInstant ()); }

Merk op dat we gebruik maken van een Onmiddellijk object hier en dat we bij deze conversie ook aandacht moeten besteden aan tijdzones.

Laten we vervolgens een zeer vergelijkbare oplossing gebruiken om een LocalDateTime naar een Datum voorwerp.

5. Omzetten java.time.LocalDateTime naar java.util.Date

De gemakkelijkste manier om een java.util.Date van LocalDateTime is om een ​​extensie te gebruiken voor dejava.sql.Timestamp - beschikbaar met Java 8:

openbare Datum convertToDateViaSqlTimestamp (LocalDateTime dateToConvert) {return java.sql.Timestamp.valueOf (dateToConvert); }

Maar er is natuurlijk een alternatieve oplossing een Onmiddellijk object, waarvan we verkrijgen ZonedDateTime:

Datum convertToDateViaInstant (LocalDateTime dateToConvert) {return java.util.Date .from (dateToConvert.atZone (ZoneId.systemDefault ()) .toInstant ()); }

6. Java 9-toevoegingen

In Java 9 zijn nieuwe methoden beschikbaar die de conversie tussen java.util.Date en java.time.LocalDate of java.time.LocalDateTime.

LocalDate.ofInstant (Instant instant, ZoneId zone) en LocalDateTime.ofInstant (Instant instant, ZoneId zone) bieden handige sneltoetsen:

openbare LocalDate convertToLocalDate (Date dateToConvert) {return LocalDate.ofInstant (dateToConvert.toInstant (), ZoneId.systemDefault ()); } openbare LocalDateTime convertToLocalDateTime (Date dateToConvert) {return LocalDateTime.ofInstant (dateToConvert.toInstant (), ZoneId.systemDefault ()); }

7. Conclusie

In dit artikel hebben we mogelijke manieren besproken om oud te converteren java.util.Date in nieuw java.time.LocalDate en java.time.LocalDateTime, evenals andersom.

De volledige implementatie van dit artikel is beschikbaar op GitHub.