TemporalAdjuster i Java

1. Oversigt

I denne tutorial får vi et hurtigt kig på TemporalAdjuster og brug det i et par praktiske scenarier.

Java 8 introducerede et nyt bibliotek til at arbejde med datoer og tidspunkter - java.tid og TemporalAdjuster er en del af det. Hvis du vil læse mere om java.time, tjek denne indledende artikel.

Kort fortalt, TemporalAdjuster er en strategi til justering af a Temporal objekt. Før du går ind i brugen af TemporalAdjuster, lad os se på Temporal interface selv.

2. Temporal

EN Temporal definerer en repræsentation af en dato, et klokkeslæt eller en kombination af begge, afhængigt af den implementering, vi skal bruge.

Der er en række implementeringer af Temporal interface, herunder:

  • LocalDate - som repræsenterer en dato uden en tidszone
  • LocalDateTime - som repræsenterer en dato og et klokkeslæt uden en tidszone
  • HijrahDate - som repræsenterer en dato i Hijrah-kalendersystemet
  • MinguoDate - som repræsenterer en dato i Minguo-kalendersystemet
  • ThaiBuddhistDate - som repræsenterer en dato i det thailandske buddhistiske kalendersystem

3. TemporalAdjuster

En af grænsefladerne i dette nye bibliotek er TemporalAdjuster.

TemporalAdjuster er en funktionel grænseflade, som har mange foruddefinerede implementeringer i TemporalAdjustters klasse. Interfacet har en enkelt abstrakt metode navngivet justerInto () som kan kaldes i enhver implementering ved at videresende en Temporal modsætter sig det.

TemporalAdjuster giver os mulighed for at udføre komplekse datemanipulationer. For eksempel, kan vi hente datoen for den næste søndag, den sidste dag i den aktuelle måned eller den første dag i det næste år. Vi kan selvfølgelig gøre dette ved hjælp af det gamle java.util.Kalender.

Imidlertid trækker den nye API den underliggende logik væk ved hjælp af dens foruddefinerede implementeringer. For mere information, besøg Javadoc.

4. Foruddefineret TemporalAdjustters

Klassen TemporalAdjustters har mange foruddefinerede statiske metoder, der returnerer a TemporalAdjuster objekt til at justere Temporal objekter på mange forskellige måder, uanset hvilken implementering af Temporal de kan være.

Her er en kort liste over disse metoder og en hurtig definition af dem:

  • dayOfWeekInMonth () - en justering til den ordinære ugedag. For eksempel datoen for den anden tirsdag i marts
  • firstDayOfMonth () - en justering for datoen for den første dag i den aktuelle måned
  • firstDayOfNextMonth () - en justering for datoen for den første dag i den næste måned
  • firstDayOfNextYear () - en justering for datoen for den første dag i det næste år
  • firstDayOfYear () - en justering af datoen for den første dag i indeværende år
  • lastDayOfMonth () - en justering af datoen for den sidste dag i den aktuelle måned
  • nextOrSame () - en justering for datoen for den næste forekomst af en bestemt ugedag eller den samme dag, hvis i dag matcher den påkrævede ugedag

Som vi kan se, er metodernes navne stort set selvforklarende. For mere TemporalAdjustters, besøg Javadoc.

Lad os starte med et simpelt eksempel - i stedet for at bruge en bestemt dato som i eksemplerne, kan vi bruge LocalDate.now () for at hente den aktuelle dato fra systemuret.

Men til denne vejledning skal vi bruge en fast dato, så testene ikke mislykkes senere, når det forventede resultat ændres. Lad os se, hvordan vi kan bruge TemporalAdjustters klasse for at få datoen søndag efter 2017-07-08:

@Test offentlig ugyldig nårAdjust_thenNextSunday () {LocalDate localDate = LocalDate.of (2017, 07, 8); LocalDate nextSunday = localDate.with (TemporalAdjusters.next (DayOfWeek.SUNDAY)); Streng forventet = "09-07-2017"; assertEquals (forventet, nextSunday.toString ()); }

Sådan får vi den sidste dag i den aktuelle måned:

LocalDate lastDayOfMonth = localDate.with (TemporalAdjusters.lastDayOfMonth ());

5. Definition af brugerdefineret TemporalAdjuster Implementeringer

Vi kan også definere vores brugerdefinerede implementeringer til TemporalAdjuster. Der er to forskellige måder at gøre dette på.

5.1. Brug af Lambda-udtryk

Lad os se, hvordan vi kan få den dato, der er 14 dage efter 2017-07-08 ved hjælp af Temporal.with () metode:

@Test offentlig ugyldig nårAdjust_thenFourteenDaysAfterDate () {LocalDate localDate = LocalDate.of (2017, 07, 8); TemporalAdjuster temporalAdjuster = t -> t.plus (Period.ofDays (14)); LocalDate-resultat = localDate.with (temporalAdjuster); String fourteenDaysAfterDate = "22-07-2017"; assertEquals (fourteenDaysAfterDate, result.toString ()); }

I dette eksempel indstiller vi ved hjælp af et lambda-udtryk temporalAdjuster gør indsigelse mod at tilføje 14 dage til localDate objekt, der indeholder datoen (2017-07-08).

Lad os se, hvordan vi kan få datoen for arbejdsdagen lige efter 07-07-08 ved at definere vores egen TemporalAdjuster implementeringer ved hjælp af et lambda-udtryk. Men denne gang ved hjælp af ofDateAdjuster () statisk fabriksmetode:

statisk TemporalAdjuster NEXT_WORKING_DAY = TemporalAdjusters.ofDateAdjuster (date -> {DayOfWeek dayOfWeek = date.getDayOfWeek (); int daysToAdd; if (dayOfWeek == DayOfWeek.FRIDAY) daysToAdd = 3; ; else daysToAdd = 1; returner i dag.plusDays (dageToAdd);});

Test af vores kode:

@Test offentlig ugyldig nårAdjust_thenNextWorkingDay () {LocalDate localDate = LocalDate.of (2017, 07, 8); TemporalAdjuster temporalAdjuster = NEXT_WORKING_DAY; LocalDate-resultat = localDate.with (temporalAdjuster); assertEquals ("2017-07-10", date.toString ()); }

5.2. Ved at implementere TemporalAdjuster Interface

Lad os se, hvordan vi kan skrive en brugerdefineret TemporalAdjuster der opnår arbejdsdagen efter 2017-07-08 ved at implementere TemporalAdjuster grænseflade:

offentlig klasse CustomTemporalAdjuster implementerer TemporalAdjuster {@Override public Temporal adjustInto (Temporal temporal) {DayOfWeek dayOfWeek = DayOfWeek.of (temporal.get (ChronoField.DAY_OF_WEEK)); int dageTilføj; hvis (dayOfWeek == DayOfWeek.FRIDAY) daysToAdd = 3; ellers hvis (dayOfWeek == DayOfWeek.SATURDAY) daysToAdd = 2; ellers daysToAdd = 1; return temporal.plus (daysToAdd, ChronoUnit.DAYS); }}

Lad os nu køre vores test:

@Test offentlig ugyldig nårAdjustAndImplementInterface_thenNextWorkingDay () {LocalDate localDate = LocalDate.of (2017, 07, 8); CustomTemporalAdjuster temporalAdjuster = ny CustomTemporalAdjuster (); LocalDate nextWorkingDay = localDate.with (temporalAdjuster); assertEquals ("2017-07-10", nextWorkingDay.toString ()); }

6. Konklusion

I denne vejledning har vi vist hvad TemporalAdjuster er, foruddefineret TemporalAdjustters, hvordan de kan bruges, og hvordan vi kan implementere vores brugerdefinerede TemporalAdjuster implementeringer på to forskellige måder.

Den fulde implementering af denne vejledning kan findes på GitHub.


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