TemporalAdjuster v Jave

1. Prehľad

V tomto výučbe sa rýchlo pozrieme na TemporalAdjuster a použiť ho v niekoľkých praktických scenároch.

Java 8 predstavila novú knižnicu pre prácu s dátumami a časmi - java.time a TemporalAdjuster je jeho súčasťou. Ak si chcete prečítať viac o java.time, pozri si tento úvodný článok.

Jednoducho povedané, TemporalAdjuster je stratégia na prispôsobenie a Dočasný objekt. Predtým, ako sa pustíte do používania TemporalAdjuster, poďme sa pozrieť na Dočasný samotné rozhranie.

2. Dočasný

A Dočasný definuje reprezentáciu dátumu, času alebo ich kombinácie v závislosti od implementácie, ktorú budeme používať.

Existuje niekoľko implementácií Dočasný rozhranie vrátane:

  • LocalDate - ktorý predstavuje dátum bez časovej zóny
  • LocalDateTime - ktorý predstavuje dátum a čas bez časového pásma
  • HijrahDate - ktorý predstavuje dátum v kalendárnom systéme Hidžra
  • MinguoDate - ktorý predstavuje dátum v systéme kalendára Minguo
  • ThaiBuddhistDate - ktorý predstavuje dátum v systéme thajského budhistického kalendára

3. TemporalAdjuster

Jedným z rozhraní zahrnutých v tejto novej knižnici je TemporalAdjuster.

TemporalAdjuster je funkčné rozhranie, ktoré má mnoho preddefinovaných implementácií v systéme Windows TemporalAdjusters trieda. Rozhranie má pomenovanú jednu abstraktnú metódu adjustInto () ktorú je možné vyvolať v ktorejkoľvek z jej implementácií absolvovaním a Dočasný namietať proti tomu.

TemporalAdjuster umožňuje nám vykonávať zložité manipulácie s dátumami. Napríklad, môžeme získať dátum nasledujúcej nedele, posledného dňa aktuálneho mesiaca alebo prvého dňa nasledujúceho roka. Môžeme to, samozrejme, urobiť pomocou starého java.util.Calendar.

Nové API však abstrahuje základnú logiku pomocou svojich preddefinovaných implementácií. Ďalšie informácie nájdete na Javadoc.

4. Preddefinované TemporalAdjusters

Trieda TemporalAdjusters má veľa preddefinovaných statických metód, ktoré vracajú a TemporalAdjuster objekt upraviť Dočasný objektov mnohými rôznymi spôsobmi bez ohľadu na to, aká je implementácia Dočasný mohli by byť.

Tu je krátky zoznam týchto metód a ich rýchla definícia:

  • dayOfWeekInMonth () - nastavovač pre ordinálny deň v týždni. Napríklad dátum druhého marcového utorka
  • firstDayOfMonth () - nastavovač dátumu prvého dňa aktuálneho mesiaca
  • firstDayOfNextMonth () - nastavovač dátumu prvého dňa nasledujúceho mesiaca
  • firstDayOfNextYear () - úprava dátumu prvého dňa nasledujúceho roka
  • firstDayOfYear () - úprava dátumu prvého dňa aktuálneho roka
  • lastDayOfMonth () - nastavovač dátumu posledného dňa aktuálneho mesiaca
  • nextOrSame () - nastavovač dátumu najbližšieho výskytu konkrétneho týždňa alebo toho istého dňa v prípade, že sa dnešný deň zhoduje s požadovaným dňom v týždni

Ako vidíme, názvy metód sú do veľkej miery vysvetľujúce. Pre viac TemporalAdjusters, navštívte Javadoc.

Začnime jednoduchým príkladom - namiesto konkrétneho dátumu uvedeného v príkladoch môžeme použiť LocalDate.now () získať aktuálny dátum zo systémových hodín.

Ale pre tento tutoriál budeme používať pevný dátum, aby testy nesklamali neskôr, keď sa zmení očakávaný výsledok. Pozrime sa, ako môžeme použiť TemporalAdjusters triedy na získanie dátumu nedele po 8.7.2017:

@Test public void whenAdjust_thenNextSunday () {LocalDate localDate = LocalDate.of (2017, 07, 8); LocalDate nextSunday = localDate.with (TemporalAdjusters.next (DayOfWeek.SUNDAY)); Očakávaný reťazec = "2017-07-09"; assertEquals (očakáva sa, nextSunday.toString ()); }

Takto môžeme získať posledný deň aktuálneho mesiaca:

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

5. Definovanie vlastného TemporalAdjuster Implementácie

Môžeme tiež definovať naše vlastné implementácie pre TemporalAdjuster. Existujú dva rôzne spôsoby, ako to urobiť.

5.1. Používanie výrazov Lambda

Pozrime sa, ako môžeme pomocou aplikácie získať dátum, ktorý je 14 dní po 8.7.2017 Temporal.with () metóda:

@Test public void whenAdjust_thenFourteenDaysAfterDate () {LocalDate localDate = LocalDate.of (2017, 07, 8); TemporalAdjuster temporalAdjuster = t -> t.plus (Period.ofDays (14)); Výsledok LocalDate = localDate.with (temporalAdjuster); Reťazec fourteenDaysAfterDate = "2017-07-22"; assertEquals (fourteenDaysAfterDate, result.toString ()); }

V tomto príklade sme pomocou výrazu lambda nastavili znak temporalAdjuster objekt pridať 14 dní do localDate objekt, ktorý obsahuje dátum (8. 7. 2017).

Pozrime sa, ako môžeme získať dátum pracovného dňa hneď po 8.7.2017 definovaním vlastného TemporalAdjuster implementácie využívajúce výraz lambda. Tentokrát však pomocou ofDateAdjuster () statická továrenská metóda:

static TemporalAdjuster NEXT_WORKING_DAY = TemporalAdjusters.ofDateAdjuster (date -> {DayOfWeek dayOfWeek = date.getDayOfWeek (); int daysToAdd; if (dayOfWeek == DayOfWeek.FRIDAY) daysTeAd = 3Dnes = 3; ; else daysToAdd = 1; návrat today.plusDays (daysToAdd);});

Testovanie nášho kódu:

@Test public void whenAdjust_thenNextWorkingDay () {LocalDate localDate = LocalDate.of (2017, 07, 8); TemporalAdjuster temporalAdjuster = NEXT_WORKING_DAY; Výsledok LocalDate = localDate.with (temporalAdjuster); assertEquals ("10.07.2017", date.toString ()); }

5.2. Implementáciou TemporalAdjuster Rozhranie

Pozrime sa, ako môžeme napísať zvyk TemporalAdjuster , ktorý získa pracovný deň po 08.07.2017 implementáciou TemporalAdjuster rozhranie:

verejná trieda CustomTemporalAdjuster implementuje TemporalAdjuster {@Override public Temporal adjustInto (Temporal temporal) {DayOfWeek dayOfWeek = DayOfWeek.of (temporal.get (ChronoField.DAY_OF_WEEK)); int daysToAdd; if (dayOfWeek == DayOfWeek.FRIDAY) daysToAdd = 3; inak if (dayOfWeek == DayOfWeek.SATURDAY) daysToAdd = 2; else daysToAdd = 1; návrat temporal.plus (daysToAdd, ChronoUnit.DAYS); }}

Teraz spustíme náš test:

@Test public void whenAdjustAndImplementInterface_thenNextWorkingDay () {LocalDate localDate = LocalDate.of (2017, 07, 8); CustomTemporalAdjuster temporalAdjuster = nový CustomTemporalAdjuster (); LocalDate nextWorkingDay = localDate.with (temporalAdjuster); assertEquals ("10.07.2017", nextWorkingDay.toString ()); }

6. Záver

V tomto tutoriáli sme si ukázali, čo TemporalAdjuster je preddefinované Temporal Adjusters, ako sa dajú použiť a ako môžeme implementovať náš zvyk TemporalAdjuster implementácie dvoma rôznymi spôsobmi.

Celú implementáciu tohto tutoriálu nájdete na GitHub.


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