Få dato uden tid i Java

1. Introduktion

I denne korte vejledning viser vi, hvordan man får en Dato uden tid i Java.

Vi viser, hvordan man gør dette før og efter Java 8, da tingene er blevet lidt anderledes efter frigivelsen af ​​den nye tids-API i Java 8.

2. Før Java 8

Før Java 8 var der ikke en direkte måde at få en Dato uden tid, medmindre vi brugte tredjepartsbiblioteker som Joda-time.

Dette er fordi det Dato klasse i Java er en repræsentation af et bestemt øjeblik i tid udtrykt i millisekunder. Derfor gør det det umuligt at ignorere tiden på en Dato.

I de næste sektioner viser vi nogle almindelige løsninger til at tackle dette problem.

2.1. Ved brug af Kalender

En af de mest almindelige måder at få en Dato uden tid er det brug Kalender klasse for at indstille tiden til nul. Ved at gøre dette får vi en ren dato med den tid, der er indstillet i starten af ​​dagen.

Lad os se det i kode:

offentlig statisk dato getDateWithoutTimeUsingCalendar () {Kalender kalender = Calendar.getInstance (); calendar.set (Calendar.HOUR_OF_DAY, 0); calendar.set (Calendar.MINUTE, 0); calendar.set (Calendar.SECOND, 0); calendar.set (Calendar.MILLISECOND, 0); returner kalender.getTime (); }

Hvis vi kalder denne metode, får vi en dato som denne:

Lør 23 juni 00:00:00 CEST 2018

Som vi kan se, returnerer den en fuld dato med tiden indstillet til nul, men vi kan ikke ignorere tiden.

Også for at sikre, at der ikke er angivet nogen tid i Dato returneret, kan vi oprette følgende test:

@Test offentlig ugyldig nårGettingDateWithoutTimeUsingCalendar_thenReturnDateWithoutTime () {Date dateWithoutTime = DateWithoutTime.getDateWithoutTimeUsingCalendar (); Kalenderkalender = Calendar.getInstance (); calendar.setTime (dateWithoutTime); int dag = kalender.get (Kalender.DAY_OF_MONTH); calendar.setTimeInMillis (dateWithoutTime.getTime () + MILLISECONDS_PER_DAY - 1); assertEquals (dag, kalender.get (Kalender.DAG_OF_MONTH)); calendar.setTimeInMillis (dateWithoutTime.getTime () + MILLISECONDS_PER_DAY); assertNotEquals (dag, kalender.get (Kalender.DAY_OF_MONTH)); }

Som vi kan se, når vi tilføjer til datoen millisekunder på en dag minus en, får vi stadig den samme dag, men når vi tilføjer en hel dag, får vi den næste dag.

2.2. Brug af en formatering

En anden måde at gøre dette på er ved formatering af en Dato ind i en Snor uden tid og derefter konvertere det Snor tilbage til en Dato. Siden den Snor blev formateret uden tiden Dato konverteret har tiden sat til nul.

Lad os implementere det for at se, hvordan det fungerer:

offentlig statisk dato getDateWithoutTimeUsingFormat () kaster ParseException {SimpleDateFormat formatter = ny SimpleDateFormat ("dd / MM / åååå"); returnere formatter.parse (formatter.format (ny dato ())); }

Denne implementering returnerer det samme som metoden vist i det foregående afsnit:

Lør 23 juni 00:00:00 CEST 2018

Igen kan vi bruge en test, som vi gjorde før, for at sikre, at der ikke er tid i Dato vendt tilbage.

3. Brug af Java 8

Med udgivelsen af ​​den nye tids-API i Java 8 er der en lettere måde at få en dato uden tid. En af de nye funktioner, som denne nye API har bragt, er, at der er flere klasser at arbejde med datoer med eller uden tid eller endda kun at arbejde med tiden.

Af hensyn til denne artikel vil vi fokusere på klassen LocalDate, som repræsenterer nøjagtigt det, vi har brug for, en dato uden klokkeslæt.

Lad os se det med dette eksempel:

offentlig statisk LocalDate getLocalDate () {return LocalDate.now (); }

Denne metode returnerer a LocalDate modstand med denne dato repræsentation:

2018-06-23

Som vi kan se, returnerer den kun en dato, tiden ignoreres fuldstændigt.

Lad os igen teste det som før for at sikre os, at denne metode fungerer som forventet:

@Test offentlig ugyldig nårGettingLocalDate_thenReturnDateWithoutTime () {LocalDate localDate = DateWithoutTime.getLocalDate (); lang millisLocalDate = localDate .atStartOfDay () .toInstant (OffsetDateTime .now () .getOffset ()) .toEpochMilli (); Kalenderkalender = Calendar.getInstance (); calendar.setTimeInMillis (millisLocalDate + MILLISECONDS_PER_DAY - 1); assertEquals (localDate.getDayOfMonth (), calendar.get (Calendar.DAY_OF_MONTH)); calendar.setTimeInMillis (millisLocalDate + MILLISECONDS_PER_DAY); assertNotEquals (localDate.getDayOfMonth (), calendar.get (Calendar.DAY_OF_MONTH)); }

4. Konklusion

I denne artikel har vi vist, hvordan man får en Dato uden tid i Java. Vi viste først, hvordan man gør det før Java 8 og også bruger Java 8.

Som vi kunne se i eksemplerne implementeret i artiklen ved hjælp af Java 8 skal altid være den foretrukne mulighed, da det har en specifik repræsentation til at arbejde med datoer uden tid.

Som altid er den fulde kildekode for eksemplerne tilgængelig på GitHub.