Kontrollerer, om to Java-datoer er på samme dag

1. Oversigt

I denne hurtige vejledning vi lærer om flere forskellige måder at kontrollere, om to java.util.Date genstande har samme dag.

Vi begynder med at overveje løsninger, der bruger Java-kernen - nemlig Java 8-funktioner - inden vi ser på et par præ-Java 8-alternativer.

For at afslutte ser vi også på nogle eksterne biblioteker - Apache Commons Lang, Joda-Time og Date4J.

2. Core Java

Klassen Dato repræsenterer et specifikt øjeblik i tid med millisekundpræcision. For at finde ud af om to Dato genstande indeholder samme dag, vi er nødt til at kontrollere, om år-måned-dagen er den samme for begge objekter og kassere tidsaspektet.

2.1. Ved brug af LocalDate

Med den nye Date-Time API af Java 8 kan vi bruge LocalDate objekt. Dette er et uforanderligt objekt, der repræsenterer en dato uden tid.

Lad os se, hvordan vi kan kontrollere, om to Dato objekter har samme dag ved hjælp af denne klasse:

public static boolean isSameDay (Date date1, Date date2) {LocalDate localDate1 = date1.toInstant () .atZone (ZoneId.systemDefault ()) .toLocalDate (); LocalDate localDate2 = date2.toInstant () .atZone (ZoneId.systemDefault ()) .toLocalDate (); returner localDate1.isEqual (localDate2); }

I dette eksempel vi har konverteret begge Dato genstande mod LocalDate ved hjælp af standardtidszonen. Når vi er konverteret, skal vi bare kontrollere, om LocalDate objekter er ens ved hjælp af er ligestillet metode.

Derfor vil vi ved hjælp af denne tilgang være i stand til at afgøre, om de to Dato genstande indeholder samme dag.

2.2. Ved brug af Øjeblikkelig

I eksemplet ovenfor brugte vi Øjeblikkelig som et mellemliggende objekt ved konvertering Dato genstande mod LocalDate genstande. Øjeblikkelig, introduceret i Java 8, repræsenterer et bestemt tidspunkt.

Vi kan direkte afkorte Øjeblikkelig modsætter sig DAYS-enheden, der sætter tidsfeltets værdier til nul, og så kan vi sammenligne dem:

public static boolean isSameDayUsingInstant (Date date1, Date date2) {Instant instant1 = date1.toInstant () .truncatedTo (ChronoUnit.DAYS); Øjeblikkelig instant2 = date2.toInstant () .truncatedTo (ChronoUnit.DAYS); returner instant1.equals (instant2); }

2.3. Ved brug af SimpleDateFormat

Siden tidlige versioner af Java har vi været i stand til at bruge SimpleDateFormat klasse at konvertere mellem Dato og Snor objektrepræsentationer. Denne klasse leveres med støtte til konvertering ved hjælp af mange mønstre. I vores tilfælde vil vi bruge mønsteret "ååååMMdd".

Ved hjælp af dette formaterer vi Dato, konvertere det til en Snor objekt, og sammenlign dem derefter ved hjælp af standarden lige med metode:

offentlig statisk boolsk isSameDay (dato dato1, dato dato2) {SimpleDateFormat fmt = ny SimpleDateFormat ("ååååMMdd"); returner fmt.format (date1) .equals (fmt.format (date2)); }

2.4. Ved brug af Kalender

Det Kalender klasse giver metoder til at hente værdierne for forskellige dato-tidsenheder i et bestemt øjeblik.

For det første skal vi oprette en Kalender forekomst og indstil Kalender objektets tid ved hjælp af hver af de angivne datoer. Så kan vi spørge og sammenligne attributterne år-måned-dag individuelt for at finde ud af om Dato genstande har samme dag:

offentlig statisk boolsk isSameDay (Dato dato1, Dato dato2) {Kalenderkalender1 = Calendar.getInstance (); kalender1.setTime (dato1); Kalenderkalender2 = Calendar.getInstance (); kalender2.setTime (dato2); returner kalender1.get (Kalender.ÅR) == kalender2.get (Kalender.ÅR) && kalender1.get (Kalender.MÅNED) == kalender2.get (Kalender.MÅNED) && kalender1.get (Kalender.DAG_OF_MÅNED) == kalender2 .get (Kalender.DAY_OF_MONTH); }

3. Eksterne biblioteker

Nu hvor vi har en god forståelse af, hvordan vi kan sammenligne Dato objekter, der bruger de nye og gamle API'er, der tilbydes af core Java, lad os se på nogle eksterne biblioteker.

3.1. Apache Commons Lang DateUtils

Det DateUtils klasse giver mange nyttige hjælpeprogrammer, der gør det lettere at arbejde med arven Kalender og Dato genstande.

Apache Commons Lang-artefakten fås fra Maven Central:

 org.apache.commons commons-lang3 3.9 

Så kan vi simpelthen bruge metoden isSameDay fra DateUtils:

DateUtils.isSameDay (dato1, dato2);

3.2. Joda-Time Bibliotek

Et alternativ til kernen Java Dato og Tid bibliotek er Joda-Time. Dette udbredte bibliotek tjener en fremragende erstatning, når du arbejder med dato og tid.

Artefakten kan findes på Maven Central:

 joda-tid joda-tid 2.10 

I dette bibliotek org.joda.time.LocalDate repræsenterer en dato uden tid. Derfor kan vi konstruere LocalDate genstande fra java.util.Date objekter og sammenlign dem derefter:

offentlig statisk boolsk isSameDay (Dato dato1, Dato dato2) {org.joda.time.LocalDate localDate1 = ny org.joda.time.LocalDate (dato1); org.joda.time.LocalDate localDate2 = ny org.joda.time.LocalDate (dato2); returner localDate1.equals (localDate2); }

3.3. Date4J-bibliotek

Date4j giver også en ligetil og enkel implementering, som vi kan bruge.

Ligeledes er den også tilgængelig fra Maven Central:

 com.darwinsys hirondelle-date4j 1.5.1 

Brug af dette bibliotek er det nødvendigt konstruere Dato tid objekt fra en java.util.Date objekt. Så kan vi bare brug isSameDayAs metode:

public static boolean isSameDay (Date date1, Date date2) {DateTime dateObject1 = DateTime.forInstant (date1.getTime (), TimeZone.getDefault ()); DateTime dateObject2 = DateTime.forInstant (date2.getTime (), TimeZone.getDefault ()); return dateObject1.isSameDayAs (dateObject2); }

4. Konklusion

I denne hurtige vejledning har vi undersøgt flere måder at kontrollere, om to java.util.Date genstande indeholder samme dag.

Som altid er artiklens fulde kildekode tilgængelig på GitHub.