Kontrollerer om to Java-datoer er samme dag

1. Oversikt

I denne raske opplæringen, vi lærer om flere forskjellige måter å sjekke om to java.util.Date gjenstander har samme dag.

Vi starter med å vurdere løsninger som bruker Java-kjerne - nemlig Java 8-funksjoner - før vi ser på et par alternativer før Java 8.

For å fullføre, vil vi også se på noen eksterne biblioteker - Apache Commons Lang, Joda-Time og Date4J.

2. Core Java

Klassen Dato representerer et bestemt øyeblikk i tid, med millisekund presisjon. For å finne ut om to Dato gjenstander inneholder samme dag, vi må sjekke om år-måned-dagen er den samme for begge objekter og forkaste tidsaspektet.

2.1. Ved hjelp av LocalDate

Med den nye Date-Time API-en til Java 8 kan vi bruke LocalDate gjenstand. Dette er et uforanderlig objekt som representerer en dato uten tid.

La oss se hvordan vi kan sjekke om to Dato objekter har samme dag som bruker denne klassen:

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 eksemplet, vi har konvertert begge Dato gjenstander til LocalDate ved hjelp av standard tidssone. Når vi er konvertert, trenger vi bare sjekk om LocalDate objektene er like ved hjelp av er lik metode.

Følgelig, ved å bruke denne tilnærmingen, vil vi kunne avgjøre om de to Dato gjenstander inneholder samme dag.

2.2. Ved hjelp av Umiddelbar

I eksemplet ovenfor brukte vi Umiddelbar som et mellomobjekt ved konvertering Dato gjenstander til LocalDate gjenstander. Umiddelbar, introdusert i Java 8, representerer et bestemt tidspunkt.

Vi kan direkte avkort Umiddelbar gjenstander til DAYS-enheten, som setter tidsfeltverdiene til null, og så kan vi sammenligne dem:

offentlig statisk boolsk isSameDayUsingInstant (Date date1, Date date2) {Instant instant1 = date1.toInstant () .truncatedTo (ChronoUnit.DAYS); Øyeblikkelig instant2 = date2.toInstant () .truncatedTo (ChronoUnit.DAYS); returner instant1.equals (instant2); }

2.3. Ved hjelp av SimpleDateFormat

Siden tidlige versjoner av Java har vi kunnet bruke SimpleDateFormat klasse å konvertere mellom Dato og String objektrepresentasjoner. Denne klassen kommer med støtte for konvertering ved hjelp av mange mønstre. I vårt tilfelle vil vi bruke mønsteret "ååååMMdd".

Ved å bruke dette vil vi formatere Dato, konvertere den til en String objektet, og sammenlign dem deretter ved hjelp av standarden er lik metode:

public static boolean isSameDay (Date date1, Date date2) {SimpleDateFormat fmt = new SimpleDateFormat ("yyyyMMdd"); return fmt.format (date1) .equals (fmt.format (date2)); }

2.4. Ved hjelp av Kalender

De Kalender klasse gir metoder for å hente verdiene til forskjellige dato-tidsenheter for et bestemt øyeblikk.

For det første må vi lage en Kalender forekomst og still inn Kalender objektets tid ved å bruke hver av de angitte datoene. Så kan vi spørre og sammenligne attributtene år-måned-dag hver for seg for å finne ut om Dato gjenstander har samme dag:

public static boolean isSameDay (Date date1, Date date2) {Calendar calendar1 = Calendar.getInstance (); kalender1.setTime (dato1); Kalenderkalender2 = Calendar.getInstance (); kalender2.setTime (dato2); return kalender1.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. Eksterne biblioteker

Nå som vi har en god forståelse av hvordan vi kan sammenligne Dato objekter som bruker de nye og gamle API-ene som tilbys av kjernen Java, la oss ta en titt på noen eksterne biblioteker.

3.1. Apache Commons Lang DateUtils

De DateUtils klasse gir mange nyttige verktøy som gjør det lettere å jobbe med arven Kalender og Dato gjenstander.

Apache Commons Lang-gjenstanden er tilgjengelig fra Maven Central:

 org.apache.commons commons-lang3 3.9 

Da kan vi ganske enkelt bruke metoden isSameDay fra DateUtils:

DateUtils.isSameDay (date1, date2);

3.2. Joda-Time Library

Et alternativ til kjernen Java Dato og Tid biblioteket er Joda-Time. Dette mye brukte biblioteket serverer en utmerket erstatning når du jobber med dato og tid.

Artefakten finner du på Maven Central:

 joda-tid joda-tid 2.10 

I dette biblioteket, org.joda.time.LocalDate representerer en dato uten tid. Derfor kan vi konstruere LocalDate gjenstander fra java.util.Date objekter og sammenlign dem:

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 (date2); returner localDate1.equals (localDate2); }

3.3. Date4J Library

Date4j gir også en enkel og enkel implementering som vi kan bruke.

På samme måte er den også tilgjengelig fra Maven Central:

 com.darwinsys hirondelle-date4j 1.5.1 

Ved å bruke dette biblioteket må vi konstruere Dato tid objekt fra en java.util.Date gjenstand. Da kan vi rett og slett bruke 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. Konklusjon

I denne raske opplæringen har vi utforsket flere måter å sjekke om to java.util.Date gjenstander inneholder samme dag.

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


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