Download Date Without Time in Java

1. Inleiding

In deze korte tutorial laten we zien hoe u een Datum zonder tijd in Java.

We laten zien hoe u dit voor en na Java 8 kunt doen, aangezien de zaken een beetje anders zijn geworden na de release van de nieuwe tijd-API in Java 8.

2. Voor Java 8

Vóór Java 8 was er geen directe manier om een Datum zonder tijd, tenzij we bibliotheken van derden zoals Joda-time gebruikten.

Dit is zo omdat de Datum class in Java is een weergave van een specifiek moment in de tijd, uitgedrukt in milliseconden. Dit maakt het daarom onmogelijk om de tijd op een te negeren Datum.

In de volgende secties laten we enkele veelvoorkomende oplossingen zien om dit probleem aan te pakken.

2.1. Gebruik makend van Kalender

Een van de meest gebruikelijke manieren om een Datum zonder tijd is om gebruik de Kalender class om de tijd op nul te zetten. Door dit te doen krijgen we een schone datum, met de tijd die aan het begin van de dag wordt ingesteld.

Laten we het in code bekijken:

openbare statische datum 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 calendar.getTime (); }

Als we deze methode noemen, krijgen we een datum als deze:

Zat 23 juni 00:00:00 CEST 2018

Zoals we kunnen zien, retourneert het een volledige datum met de tijd ingesteld op nul, maar we kunnen de tijd niet negeren.

Ook om ervoor te zorgen dat er geen tijd is ingesteld in het Datum geretourneerd, kunnen we de volgende test maken:

@Test openbare ongeldig whenGettingDateWithoutTimeUsingCalendar_thenReturnDateWithoutTime () {Date dateWithoutTime = DateWithoutTime.getDateWithoutTimeUsingCalendar (); Calendar calendar = Calendar.getInstance (); calendar.setTime (dateWithoutTime); int dag = 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 (dag, calendar.get (Calendar.DAY_OF_MONTH)); }

Zoals we kunnen zien, krijgen we nog steeds dezelfde dag als we bij de datum de milliseconden van een dag min één optellen, maar als we een volledige dag optellen, krijgen we de volgende dag.

2.2. Met behulp van een formatter

Een andere manier om dit te doen is door het formatteren van een Datum in een Draad zonder de tijd en zet dat dan om Draad terug naar een Datum. Sinds de Draad is geformatteerd zonder de tijd dat de Datum geconverteerd wordt de tijd op nul gezet.

Laten we het implementeren om te zien hoe het werkt:

openbare statische datum getDateWithoutTimeUsingFormat () genereert ParseException {SimpleDateFormat formatter = nieuwe SimpleDateFormat ("dd / MM / jjjj"); retourneer formatter.parse (formatter.format (new Date ())); }

Deze implementatie retourneert hetzelfde als de methode die in de vorige sectie wordt getoond:

Zat 23 juni 00:00:00 CEST 2018

Nogmaals, we kunnen een test gebruiken zoals we eerder deden om er zeker van te zijn dat er geen tijd in het Datum keerde terug.

3. Java 8 gebruiken

Met de release van de nieuwe tijd-API in Java 8 is er een gemakkelijkere manier om een ​​datum zonder tijd te krijgen. Een van de nieuwe functies die deze nieuwe API heeft gebracht, is dat er verschillende klassen zijn om te werken met datums met of zonder tijd, of zelfs om alleen met tijd te werken.

Omwille van dit artikel zullen we ons concentreren op de klas LocalDate, wat precies weergeeft wat we nodig hebben, een datum zonder tijd.

Laten we het eens bekijken met dit voorbeeld:

openbare statische LocalDate getLocalDate () {return LocalDate.now (); }

Deze methode retourneert een LocalDate object met deze datumweergave:

2018-06-23

Zoals we kunnen zien, retourneert het slechts een datum, de tijd wordt volledig genegeerd.

Nogmaals, laten we het testen zoals eerder om er zeker van te zijn dat deze methode werkt zoals verwacht:

@Test openbare ongeldigheid whenGettingLocalDate_thenReturnDateWithoutTime () {LocalDate localDate = DateWithoutTime.getLocalDate (); lange millisLocalDate = localDate .atStartOfDay () .toInstant (OffsetDateTime .now () .getOffset ()) .toEpochMilli (); Calendar calendar = 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. Conclusie

In dit artikel hebben we laten zien hoe u een Datum zonder tijd in Java. We hebben eerst laten zien hoe je het moet doen vóór Java 8 en ook met Java 8.

Zoals we konden zien in de voorbeelden die in het artikel zijn geïmplementeerd, gebruikt u Java 8 zou altijd de voorkeur moeten hebben, omdat het een specifieke weergave heeft om met datums zonder tijd te werken.

Zoals altijd is de volledige broncode van de voorbeelden beschikbaar op GitHub.