Controleren of twee Java-datums op dezelfde dag vallen

1. Overzicht

In deze korte tutorial, we zullen verschillende manieren leren om te controleren of er twee zijn java.util.Date objecten hebben dezelfde dag.

We beginnen met het overwegen van oplossingen die kern-Java gebruiken - namelijk Java 8-functies - voordat we kijken naar een aantal pre-Java 8-alternatieven.

Tot slot kijken we ook naar enkele externe bibliotheken - Apache Commons Lang, Joda-Time en Date4J.

2. Core Java

De klas Datum vertegenwoordigt een specifiek moment in de tijd, met een precisie van milliseconden. Om erachter te komen of er twee zijn Datum objecten bevatten dezelfde dag, we moeten controleren of de jaar-maand-dag hetzelfde is voor beide objecten en het tijdsaspect weggooien.

2.1. Gebruik makend van LocalDate

Met de nieuwe Date-Time API van Java 8 kunnen we de LocalDate voorwerp. Dit is een onveranderlijk object dat een datum zonder tijd vertegenwoordigt.

Laten we eens kijken hoe we kunnen controleren of er twee zijn Datum objecten hebben dezelfde dag gebruikmakend van deze klasse:

openbare statische boolean isSameDay (Date date1, Date date2) {LocalDate localDate1 = date1.toInstant () .atZone (ZoneId.systemDefault ()) .toLocalDate (); LocalDate localDate2 = date2.toInstant () .atZone (ZoneId.systemDefault ()) .toLocalDate (); retourneer localDate1.isEqual (localDate2); }

In dit voorbeeld we hebben zowel de Datum bezwaar tegen LocalDate met behulp van de standaard tijdzone. Eenmaal bekeerd, hoeven we dat alleen maar te doen controleer of het LocalDate objecten zijn gelijk met behulp van de is gelijk methode.

Daarom kunnen we met deze aanpak bepalen of de twee Datum objecten bevatten dezelfde dag.

2.2. Gebruik makend van Onmiddellijk

In het bovenstaande voorbeeld hebben we Onmiddellijk als tussenobject bij het converteren Datum bezwaar tegen LocalDate voorwerpen. Onmiddellijk, geïntroduceerd in Java 8, vertegenwoordigt een specifiek tijdstip.

We kunnen direct afkappen van de Onmiddellijk bezwaar tegen de DAGEN-eenheid, die de waarden van het tijdveld op nul zet, en dan kunnen we ze vergelijken:

openbare statische boolean isSameDayUsingInstant (Date date1, Date date2) {Instant instant1 = date1.toInstant () .truncatedTo (ChronoUnit.DAYS); Instant instant2 = date2.toInstant () .truncatedTo (ChronoUnit.DAYS); retourneer instant1.equals (instant2); }

2.3. Gebruik makend van SimpleDateFormat

Sinds vroege versies van Java kunnen we de SimpleDateFormat klasse om tussen te converteren Datum en Draad object representaties. Deze klasse wordt geleverd met ondersteuning voor conversie met behulp van veel patronen. In ons geval gebruiken we het patroon "jjjjMMdd".

Hiermee formatteren we het Datum, converteer het naar een Draad object, en vergelijk ze vervolgens met behulp van de standaard is gelijk aan methode:

openbare statische boolean isSameDay (Datum datum1, Datum datum2) {SimpleDateFormat fmt = nieuwe SimpleDateFormat ("jjjjMMdd"); retourneer fmt.format (date1) .equals (fmt.format (date2)); }

2.4. Gebruik makend van Kalender

De Kalender class biedt methoden om de waarden van verschillende datum-tijdeenheden voor een bepaald tijdstip op te halen.

Ten eerste moeten we een Kalender instantie en stel het Kalender de tijd van objecten met behulp van elk van de opgegeven datums. Dan kunnen we en vergelijk de attributen Jaar-Maand-Dag afzonderlijk om erachter te komen of het Datum objecten hebben dezelfde dag:

openbare statische boolean isSameDay (Date date1, Date date2) {Calendar calendar1 = Calendar.getInstance (); kalender1.setTime (date1); Calendar calendar2 = Calendar.getInstance (); calendar2.setTime (date2); return calendar1.get (Calendar.YEAR) == calendar2.get (Calendar.YEAR) && calendar1.get (Calendar.MONTH) == calendar2.get (Calendar.MONTH) && calendar1.get (Calendar.DAY_OF_MONTH) == kalender2 .get (Kalender.DAY_OF_MONTH); }

3. Externe bibliotheken

Nu we een goed begrip hebben van hoe we moeten vergelijken Datum objecten die de nieuwe en oude API's gebruiken die worden aangeboden door core Java, laten we eens kijken naar enkele externe bibliotheken.

3.1. Apache Commons Lang DateUtils

De DateUtils class biedt veel handige hulpprogramma's die het gemakkelijker maken om met de legacy te werken Kalender en Datum voorwerpen.

Het Apache Commons Lang-artefact is verkrijgbaar bij Maven Central:

 org.apache.commons commons-lang3 3.9 

Dan kunnen we gewoon de methode gebruiken isSameDay van DateUtils:

DateUtils.isSameDay (date1, date2);

3.2. Joda-Time-bibliotheek

Een alternatief voor de kern Java Datum en Tijd bibliotheek is Joda-Time. Deze veelgebruikte bibliotheek is een uitstekende vervanging voor het werken met datum en tijd.

Het artefact is te vinden op Maven Central:

 joda-tijd joda-tijd 2.10 

In deze bibliotheek org.joda.time.LocalDate vertegenwoordigt een datum zonder tijd. Daarom kunnen we de LocalDate objecten uit de java.util.Date objecten en vergelijk ze:

openbare statische boolean isSameDay (Datum datum1, Datum datum2) {org.joda.time.LocalDate localDate1 = nieuwe org.joda.time.LocalDate (datum1); org.joda.time.LocalDate localDate2 = nieuwe org.joda.time.LocalDate (date2); retourneer localDate1.equals (localDate2); }

3.3. Date4J Bibliotheek

Date4j biedt ook een ongecompliceerde en eenvoudige implementatie die we kunnen gebruiken.

Evenzo is het ook verkrijgbaar bij Maven Central:

 com.darwinsys hirondelle-date4j 1.5.1 

Met behulp van deze bibliotheek moeten we construeer het Datum Tijd object van een java.util.Date voorwerp. Dan kunnen we gewoon gebruik de isSameDayAs methode:

openbare statische boolean isSameDay (Date date1, Date date2) {DateTime dateObject1 = DateTime.forInstant (date1.getTime (), TimeZone.getDefault ()); DateTime dateObject2 = DateTime.forInstant (date2.getTime (), TimeZone.getDefault ()); retour dateObject1.isSameDayAs (dateObject2); }

4. Conclusie

In deze korte tutorial hebben we verschillende manieren onderzocht om te controleren of er twee zijn java.util.Date objecten bevatten dezelfde dag.

Zoals altijd is de volledige broncode van het artikel beschikbaar op GitHub.


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