TemporalAdjuster Java-ban

1. Áttekintés

Ebben az oktatóanyagban gyorsan áttekintjük a TemporalAdjuster és néhány gyakorlati forgatókönyvben használja.

A Java 8 új könyvtárat vezetett be a dátumokkal és időkkel való munkához - java.time és TemporalAdjuster része. Ha többet szeretne megtudni a java.time, ellenőrizze ezt a bevezető cikket.

Egyszerűen fogalmazva, TemporalAdjuster stratégia az a beállításához Időbeli tárgy. Mielőtt belekezdenék a TemporalAdjuster, vessünk egy pillantást a Időbeli maga az interfész.

2. Időbeli

A Időbeli meghatározza a dátum, az idő vagy mindkettő kombinációjának ábrázolását, attól függően, hogy milyen megvalósítást fogunk használni.

Számos megvalósítási módja van a Időbeli interfész, beleértve:

  • LocalDate - amely időzóna nélküli dátumot képvisel
  • LocalDateTime - amely dátumot és időpontot képvisel időzóna nélkül
  • HijrahDate - amely dátumot képvisel a hidzsrah naptár rendszerben
  • MinguoDate - amely egy dátumot képvisel a Minguo naptárrendszerben
  • ThaiBuddhistDate - amely egy dátumot jelent a thaiföldi buddhista naptárrendszerben

3. TemporalAdjuster

Az új könyvtárban található egyik interfész a TemporalAdjuster.

TemporalAdjuster egy funkcionális interfész, amely számos előre definiált megvalósítást tartalmaz a TemporalAdjusters osztály. A felületnek egyetlen elvont metódusa van adjustInto () amely bármely megvalósításában az áthaladással hívható Időbeli kifogásolja azt.

TemporalAdjuster lehetővé teszi számunkra, hogy komplex dátummanipulációkat hajtsunk végre. Például, megkaphatjuk a következő vasárnap dátumát, az adott hónap utolsó napját vagy a következő év első napját. Természetesen ezt megtehetjük a régivel java.util.Naptár.

Az új API azonban az előre definiált megvalósítások segítségével elvonja a mögöttes logikát. További információért keresse fel a Javadocot.

4. Előre meghatározott TemporalAdjusters

Osztály TemporalAdjusters sok előre definiált statikus módszerrel rendelkezik, amelyek visszaadják a TemporalAdjuster objektum állítani Időbeli az objektumok sokféleképpen, bármilyen megvalósítású is Időbeli lehetnek.

Íme egy rövid lista ezekről a módszerekről és azok rövid meghatározása:

  • dayOfWeekInMonth () - beállító a sorrendben a hét napjára. Például március második keddje
  • firstDayOfMonth () - beállító az aktuális hónap első napjának dátumához
  • firstDayOfNextMonth () - beállító a következő hónap első napjának dátumához
  • firstDayOfNextYear () - beállító a következő év első napjának dátumához
  • firstDayOfYear () - kiigazító a folyó év első napjának dátumához
  • lastDayOfMonth () - beállító az aktuális hónap utolsó napjának dátumához
  • nextOrSame () - kiigazító egy adott hét napjának vagy ugyanazon nap következő előfordulásának dátumához, ha a mai nap megegyezik a szükséges hét napjával

Mint láthatjuk, a módszerek neve nagyjából magától értetődő. Többért TemporalAdjusters, látogassa meg a Javadocot.

Kezdjük egy egyszerű példával - ahelyett, hogy egy meghatározott dátumot használnánk, mint a példákban, használhatjuk LocalDate.now () hogy megkapja az aktuális dátumot a rendszer órájáról.

De ehhez az oktatóanyaghoz rögzített dátumot fogunk használni, hogy a tesztek később ne bukjanak meg, amikor a várható eredmény megváltozik. Lássuk, hogyan használhatjuk a TemporalAdjusters osztály a 2017-07-08 utáni vasárnap időpontjának megszerzéséhez:

@Test public void whenAdjust_thenNextSunday () {LocalDate localDate = LocalDate.of (2017, 07, 8); LocalDate nextSunday = localDate.with (TemporalAdjusters.next (DayOfWeek.SUNDAY)); Várható karakterlánc = "2017-07-09"; assertEquals (várható, nextSunday.toString ()); }

Így kaphatjuk meg az aktuális hónap utolsó napját:

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

5. Az egyedi meghatározása TemporalAdjuster Végrehajtások

Meghatározhatjuk az egyéni megvalósításokat is TemporalAdjuster. Ennek kétféle módja van.

5.1. A Lambda kifejezések használata

Lássuk, hogyan szerezhetjük meg a dátumot, amely 2017-07-08 után 14 nap Temporal.with () módszer:

@Test public void whenAdjust_thenFourteenDaysAfterDate () {LocalDate localDate = LocalDate.of (2017, 07, 8); TemporalAdjuster temporalAdjuster = t -> t.plus (Period.ofDays (14)); LocalDate eredmény = localDate.with (temporalAdjuster); String fourteenDaysAfterDate = "2017-07-22"; assertEquals (tizennégyDaysAfterDate, result.toString ()); }

Ebben a példában egy lambda kifejezést használva állítjuk be a temporalAdjuster objektum hozzáadni 14 napot a localDate objektum, amely a dátumot (2017-07-08) tartja.

Lássuk, hogyan szerezhetjük meg a munkanap dátumát közvetlenül 2017-07-08 után, ha meghatározzuk a sajátunkat TemporalAdjuster megvalósítások lambda kifejezéssel. De ezúttal a ofDateAdjuster () statikus gyári módszer:

statikus TemporalAdjuster NEXT_WORKING_DAY = TemporalAdjusters.ofDateAdjuster (dátum -> {DayOfWeek napOfWeek = dátum.getDayOfWeek (); int daysToAdd; if (dayOfWeek == DayOfWeek.FRIDAY ; else daysToAdd = 1; return today.plusDays (daysToAdd);});

Kódunk tesztelése:

@Test public void whenAdjust_thenNextWorkingDay () {LocalDate localDate = LocalDate.of (2017, 07, 8); TemporalAdjuster temporalAdjuster = NEXT_WORKING_DAY; LocalDate eredmény = localDate.with (temporalAdjuster); assertEquals ("2017-07-10", date.toString ()); }

5.2. A TemporalAdjuster Felület

Lássuk, hogyan írhatunk egy szokást TemporalAdjuster amely a 2017-07-08 utáni munkanapot a TemporalAdjuster felület:

public class CustomTemporalAdjuster implementálja a TemporalAdjuster {@Orride public Temporal adjustInto (Temporal temporal) {DayOfWeek dayOfWeek = DayOfWeek.of (temporal.get (ChronoField.DAY_OF_WEEK)); int daysToAdd; if (dayOfWeek == DayOfWeek.FRIDAY) daysToAdd = 3; else if (dayOfWeek == DayOfWeek.SATURDAY) daysToAdd = 2; else daysToAdd = 1; return temporal.plus (daysToAdd, ChronoUnit.DAYS); }}

Most futtassuk a tesztünket:

@Test public void whenAdjustAndImplementInterface_thenNextWorkingDay () {LocalDate localDate = LocalDate.of (2017, 07, 8); CustomTemporalAdjuster temporalAdjuster = új CustomTemporalAdjuster (); LocalDate nextWorkingDay = localDate.with (temporalAdjuster); assertEquals ("2017-07-10", nextWorkingDay.toString ()); }

6. Következtetés

Ebben az oktatóanyagban megmutattuk, mit TemporalAdjuster azaz előre definiált TemporalAdjusters, hogyan használhatók és hogyan tudjuk megvalósítani szokásunkat TemporalAdjuster megvalósítások két különböző módon.

Az oktatóanyag teljes megvalósítása megtalálható a GitHub oldalon.