TemporalAdjuster i Java

1. Oversikt

I denne opplæringen tar vi en rask titt på TemporalAdjuster og bruk den i noen få praktiske scenarier.

Java 8 introduserte et nytt bibliotek for å jobbe med datoer og klokkeslett - java.time og TemporalAdjuster er en del av det. Hvis du vil lese mer om java.time, sjekk denne innledende artikkelen.

For å si det enkelt, TemporalAdjuster er en strategi for å justere a Temporal gjenstand. Før du går inn i bruken av TemporalAdjuster, la oss ta en titt på Temporal grensesnittet selv.

2. Temporal

EN Temporal definerer en representasjon av en dato, et tidspunkt eller en kombinasjon av begge, avhengig av implementeringen vi skal bruke.

Det er en rekke implementeringer av Temporal grensesnitt, inkludert:

  • LocalDate - som representerer en dato uten tidssone
  • LocalDateTime - som representerer en dato og tid uten tidssone
  • HijrahDate - som representerer en dato i Hijrah-kalendersystemet
  • MinguoDate - som representerer en dato i Minguo-kalendersystemet
  • ThaiBuddhistDate - som representerer en dato i det thailandske buddhistiske kalendersystemet

3. TemporalAdjuster

En av grensesnittene som er inkludert i dette nye biblioteket er TemporalAdjuster.

TemporalAdjuster er et funksjonelt grensesnitt som har mange forhåndsdefinerte implementeringer i TemporalAdjustters klasse. Grensesnittet har en enkelt abstrakt metode som heter justerInto () som kan kalles i noen av implementeringene ved å sende en Temporal motsette seg det.

TemporalAdjuster lar oss utføre komplekse datomanipulasjoner. For eksempel, kan vi få dato for neste søndag, den siste dagen i inneværende måned eller den første dagen i det neste året. Vi kan selvfølgelig gjøre dette ved hjelp av det gamle java.util.Kalender.

Imidlertid trekker den nye APIen bort den underliggende logikken ved hjelp av de forhåndsdefinerte implementeringene. For mer informasjon, besøk Javadoc.

4. Forhåndsdefinert TemporalAdjustters

Klassen TemporalAdjustters har mange forhåndsdefinerte statiske metoder som returnerer a TemporalAdjuster objekt å justere Temporal objekter på mange forskjellige måter uansett hvilken implementering av Temporal de kan være.

Her er en kort liste over disse metodene og en rask definisjon av dem:

  • dayOfWeekInMonth () - en justerer for den ordinære ukedagen. For eksempel datoen for andre tirsdag i mars
  • firstDayOfMonth () - en justerer for datoen for den første dagen i inneværende måned
  • firstDayOfNextMonth () - en justerer for datoen den første dagen i neste måned
  • firstDayOfNextYear () - en justerer for datoen den første dagen neste år
  • firstDayOfYear () - en justerer for datoen for den første dagen i inneværende år
  • lastDayOfMonth () - en justerer for datoen for den siste dagen i inneværende måned
  • nextOrSame () - en justering for datoen for neste forekomst av en bestemt ukedag eller samme dag i tilfelle i dag samsvarer med ønsket ukedag

Som vi kan se, er metodenes navn ganske mye selvforklarende. For mer TemporalAdjustters, besøk Javadoc.

La oss starte med et enkelt eksempel - i stedet for å bruke en bestemt dato som i eksemplene, kan vi bruke LocalDate.now () for å få den gjeldende datoen fra systemklokken.

Men for denne opplæringen skal vi bruke en fast dato slik at testene ikke mislykkes senere når forventet resultat endres. La oss se hvordan vi kan bruke TemporalAdjustters klasse for å få dato på søndagen etter 08.08.2017:

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

Slik får vi den siste dagen i den nåværende måneden:

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

5. Definere egendefinert TemporalAdjuster Implementeringer

Vi kan også definere våre tilpassede implementeringer for TemporalAdjuster. Det er to forskjellige måter å gjøre dette på.

5.1. Bruke Lambda Expressions

La oss se hvordan vi kan oppnå datoen som er 14 dager etter 08-07-2017 ved hjelp av 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 eksemplet, ved hjelp av et lambdauttrykk, setter vi temporalAdjuster innvendinger om å legge til 14 dager til localDate objekt, som inneholder datoen (2017-07-08).

La oss se hvordan vi kan få datoen for arbeidsdagen rett etter 2017-07-08 ved å definere vår egen TemporalAdjuster implementeringer ved hjelp av et lambdauttrykk. Men denne gangen ved å bruke ofDateAdjuster () statisk fabrikkmetode:

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

Testing av koden vår:

@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 å implementere TemporalAdjuster Grensesnitt

La oss se hvordan vi kan skrive en tilpasset TemporalAdjuster som oppnår arbeidsdagen etter 2017-07-08 ved å implementere TemporalAdjuster grensesnitt:

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

La oss nå prøve:

@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. Konklusjon

I denne opplæringen har vi vist hva TemporalAdjuster er, forhåndsdefinert TemporalAdjustters, hvordan de kan brukes, og hvordan vi kan implementere vår skikk TemporalAdjuster implementeringer på to forskjellige måter.

Den fulle implementeringen av denne veiledningen finner du på GitHub.


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