TemporalAdjuster na Javi

1. Pregled

U ovom ćemo uputstvu na brzinu pogledati TemporalAdjuster i upotrijebite ga u nekoliko praktičnih scenarija.

Java 8 predstavila je novu knjižnicu za rad s datumima i vremenima - java.vrijeme i TemporalAdjuster je dio toga. Ako želite pročitati više o java.time, provjerite ovaj uvodni članak.

Jednostavno rečeno, TemporalAdjuster je strategija za prilagodbu a Vremenski objekt. Prije nego što počnete koristiti Privremeni prilagodnik, hajde da pogledamo Vremenski samo sučelje.

2. Vremenski

A Vremenski definira prikaz datuma, vremena ili kombinacije oba, ovisno o implementaciji koju ćemo koristiti.

Postoji niz implementacija Vremenski sučelje, uključujući:

  • LocalDate - koji predstavlja datum bez vremenske zone
  • LocalDateTime - koji predstavlja datum i vrijeme bez vremenske zone
  • HidžraDatum - koji predstavlja datum u hidžretskom sustavu kalendara
  • MinguoDate - koji predstavlja datum u sustavu kalendara Minguo
  • ThaiBuddhistDate - koji predstavlja datum u tajlandskom budističkom sustavu kalendara

3. TemporalAdjuster

Jedno od sučelja uključenih u ovu novu knjižnicu je TemporalAdjuster.

Privremeni prilagodnik je funkcionalno sučelje koje ima mnogo unaprijed definiranih implementacija u Privremeni prilagoditelji razred. Sučelje ima jednu apstraktnu metodu pod nazivom prilagoditi u () koji se može pozvati u bilo kojoj od njegovih implementacija dodavanjem a Vremenski prigovoriti mu.

TemporalAdjuster omogućuje nam izvođenje složenih manipulacija datumom. Na primjer, možemo dobiti datum sljedeće nedjelje, zadnji dan tekućeg mjeseca ili prvi dan sljedeće godine. To naravno možemo učiniti koristeći stari java.util.Kalendar.

Međutim, novi API apstrahira temeljnu logiku koristeći svoje unaprijed definirane implementacije. Za više informacija posjetite Javadoc.

4. Unaprijed definirano Privremeni prilagoditelji

Razred Privremeni prilagoditelji ima mnogo unaprijed definiranih statičkih metoda koje vraćaju TemporalAdjuster objekt za prilagodbu Vremenski objekte na mnogo različitih načina, bez obzira na provedbu Vremenski mogli bi biti.

Evo kratkog popisa ovih metoda i njihove brze definicije:

  • dayOfWeekInMonth () - prilagodnik za redoviti dan u tjednu. Primjerice, datum drugog utorka u ožujku
  • firstDayOfMonth () - prilagodnik za datum prvog dana u tekućem mjesecu
  • firstDayOfNextMonth () - prilagodnik za datum prvog dana sljedećeg mjeseca
  • firstDayOfNextYear () - prilagodnik za datum prvog dana sljedeće godine
  • firstDayOfYear () - prilagodnik za datum prvog dana tekuće godine
  • lastDayOfMonth () - prilagodnik za datum posljednjeg dana u tekućem mjesecu
  • nextOrSame () - prilagodnik za datum sljedećeg nastupa određenog dana u tjednu ili za isti dan u slučaju da se danas podudara sa potrebnim danom u tjednu

Kao što vidimo, nazivi metoda prilično su samorazumljivi. Za više Privremeni prilagoditelji, posjetite Javadoc.

Počnimo s jednostavnim primjerom - umjesto da koristimo određeni datum kao u primjerima, možemo koristiti LocalDate.now () da biste dobili trenutni datum sa sistemskog sata.

No, za ovaj ćemo vodič upotrijebiti fiksni datum kako testovi neće uspjeti kasnije kad se očekivani rezultat promijeni. Pogledajmo kako možemo koristiti Privremeni prilagoditelji razreda kako bi se dobio datum nedjelje nakon 08.07.2017:

@Test public void whenAdjust_thenNextSunday () {LocalDate localDate = LocalDate.of (2017, 07, 8); LocalDate nextSunday = localDate.with (TemporalAdjusters.next (DayOfWeek.SUNDAY)); Očekivani niz = "09.07.2017"; assertEquals (očekuje se, nextSunday.toString ()); }

Evo kako možemo dobiti zadnji dan tekućeg mjeseca:

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

5. Utvrđivanje prilagođenih TemporalAdjuster Provedbe

Također možemo definirati naše prilagođene implementacije za TemporalAdjuster. Postoje dva različita načina za to.

5.1. Korištenje Lambda izraza

Pogledajmo kako možemo dobiti datum koji je 14 dana nakon 08.07.2017. Pomoću Privremeni.s () metoda:

@Test public void whenAdjust_thenFourteenDaysAfterDate () {LocalDate localDate = LocalDate.of (2017, 07, 8); TemporalAdjuster temporalAdjuster = t -> t.plus (Period.of Days (14)); Rezultat LocalDate = localDate.with (temporalAdjuster); String fourteenDaysAfterDate = "22.07.2017"; assertEquals (fourteenDaysAfterDate, result.toString ()); }

U ovom primjeru, koristeći lambda izraz, postavili smo temporalAdjuster objekt dodati 14 dana na localDate objekt koji sadrži datum (08.07.2017.).

Pogledajmo kako možemo dobiti datum radnog dana odmah nakon 08.07.2017. Definiranjem vlastitog TemporalAdjuster implementacije pomoću lambda izraza. Ali, ovaj put, pomoću ofDateAdjuster () statička tvornička metoda:

static TemporalAdjuster NEXT_WORKING_DAY = TemporalAdjusters.ofDateAdjuster (date -> {DayOfWeek dayOfWeek = date.getDayOfWeek (); int daysToAdd; if (dayOfWeek == DayOfWeek.FRIDAY) daysToAdd = 3D day = 0 dana = 2 dana = 0 dana; ; else daysToAdd = 1; vrati se danas.plusDays (daysToAdd);});

Testiranje našeg koda:

@Test public void whenAdjust_thenNextWorkingDay () {LocalDate localDate = LocalDate.of (2017, 07, 8); TemporalAdjuster temporalAdjuster = SLJEDEĆI_DAN RADA; Rezultat LocalDate = localDate.with (temporalAdjuster); assertEquals ("10.07.2017", date.toString ()); }

5.2. Implementacijom TemporalAdjuster Sučelje

Pogledajmo kako možemo napisati običaj TemporalAdjuster koja dobiva radni dan nakon 08.07.2017. primjenom TemporalAdjuster sučelje:

javna klasa CustomTemporalAdjuster provodi TemporalAdjuster {@Override public Temporal prilagoditeInto (Temporal temporal) {DayOfWeek dayOfWeek = DayOfWeek.of (temporal.get (ChronoField.DAY_OF_WEEK)); int daysToAdd; if (dayOfWeek == DayOfWeek.FRIDAY) daysToAdd = 3; inače if (dayOfWeek == DayOfWeek.SATURDAY) daysToAdd = 2; else daysToAdd = 1; vratiti temporal.plus (daysToAdd, ChronoUnit.DAYS); }}

Ajmo sada pokrenuti naš test:

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

6. Zaključak

U ovom uputstvu pokazali smo što TemporalAdjuster je unaprijed definirano Privremeni prilagoditelji, kako se mogu koristiti i kako možemo primijeniti svoj običaj TemporalAdjuster implementacije na dva različita načina.

Potpuna implementacija ovog vodiča može se naći na GitHubu.


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