Få dato uten tid i Java

1. Introduksjon

I denne korte opplæringen viser vi hvordan du får en Dato uten tid i Java.

Vi viser hvordan du gjør dette før og etter Java 8 siden ting har blitt litt annerledes etter utgivelsen av den nye tids-API-en i Java 8.

2. Før Java 8

Før Java 8 var det ikke en direkte måte å få en Dato uten tid med mindre vi brukte tredjepartsbiblioteker som Joda-time.

Dette er fordi de Dato klasse i Java er en representasjon av et bestemt øyeblikk i tid, uttrykt i millisekunder. Derfor gjør dette det umulig å ignorere tiden på en Dato.

I de neste avsnittene viser vi noen vanlige løsninger for å takle dette problemet.

2.1. Ved hjelp av Kalender

En av de vanligste måtene å få en Dato uten tid er å bruke Kalender klasse for å sette tiden til null. Ved å gjøre dette får vi en ren dato, med tiden angitt på starten av dagen.

La oss se det i kode:

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

Hvis vi kaller denne metoden, får vi en dato som denne:

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

Som vi kan se, returnerer den en full dato med tiden satt til null, men vi kan ikke ignorere tiden.

Også for å forsikre deg om at det ikke er satt noen tid i Dato returnert, kan vi lage følgende test:

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

Som vi kan se, når vi legger til datoen millisekunder på en dag minus en, får vi fremdeles samme dag, men når vi legger til en hel dag får vi dagen etter.

2.2. Bruke en formatering

En annen måte å gjøre dette på er formatering a Dato inn i en String uten tid og deretter konvertere det String tilbake til en Dato. Siden String ble formatert uten tiden Dato konvertert vil tiden være satt til null.

La oss implementere det for å se hvordan det fungerer:

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

Denne implementeringen returnerer det samme som metoden vist i forrige avsnitt:

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

Igjen, vi kan bruke en test som vi gjorde før for å sikre at det ikke er tid i Dato returnert.

3. Bruke Java 8

Med utgivelsen av det nye tids-API-et i Java 8, er det en enklere måte å få en dato uten tid. En av de nye funksjonene som denne nye API-en har fått, er at det er flere klasser å jobbe med datoer med eller uten tid, eller til og med å jobbe bare med tiden.

Av hensyn til denne artikkelen vil vi fokusere på klassen LocalDate, som representerer akkurat det vi trenger, en dato uten klokkeslett.

La oss se det med dette eksemplet:

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

Denne metoden returnerer a LocalDate innvende med denne datorepresentasjonen:

2018-06-23

Som vi kan se, returnerer den bare en dato, tiden blir fullstendig ignorert.

Igjen, la oss teste det som før for å sikre oss at denne metoden 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. Konklusjon

I denne artikkelen har vi vist hvordan du får en Dato uten tid i Java. Vi viste først hvordan du gjør det før Java 8 og også bruker Java 8.

Som vi kunne se i eksemplene implementert i artikkelen, ved hjelp av Java 8 bør alltid være det foretrukne alternativet, siden det har en spesifikk representasjon å jobbe med datoer uten tid.

Som alltid er hele kildekoden til eksemplene tilgjengelig på GitHub.


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