TemporalAdjuster in Java

1. Overzicht

In deze tutorial zullen we een korte blik werpen op de TemporalAdjuster en gebruik het in enkele praktische scenario's.

Java 8 introduceerde een nieuwe bibliotheek voor het werken met datums en tijden - java.time en TemporalAdjuster maakt er deel van uit. Als je meer wilt lezen over de java.time, bekijk dit inleidende artikel.

Simpel gezegd, TemporalAdjuster is een strategie voor het aanpassen van een Tijdelijk voorwerp. Voordat u begint met het gebruik van TemporalAdjuster, laten we eens kijken naar de Tijdelijk interface zelf.

2. Tijdelijk

EEN Tijdelijk definieert een weergave van een datum, tijd of een combinatie van beide, afhankelijk van de implementatie die we gaan gebruiken.

Er zijn een aantal implementaties van de Tijdelijk interface, inclusief:

  • LocalDate - wat een datum zonder tijdzone vertegenwoordigt
  • LocalDateTime - wat staat voor een datum en tijd zonder tijdzone
  • HijrahDate - wat een datum vertegenwoordigt in het Hijrah-kalendersysteem
  • MinguoDate - wat een datum in het Minguo-kalendersysteem vertegenwoordigt
  • ThaiBuddhistDate - wat een datum vertegenwoordigt in het Thaise boeddhistische kalendersysteem

3. TemporalAdjuster

Een van de interfaces in deze nieuwe bibliotheek is TemporalAdjuster.

TemporalAdjuster is een functionele interface met veel voorgedefinieerde implementaties in het Tijdregelaars klasse. De interface heeft een enkele abstracte methode met de naam adjustInto () die in elk van zijn implementaties kan worden aangeroepen door een Tijdelijk bezwaar maken.

TemporalAdjuster stelt ons in staat om complexe datamanipulaties uit te voeren. Bijvoorbeeldkunnen we de datum van de volgende zondag, de laatste dag van de huidige maand of de eerste dag van het volgende jaar verkrijgen. We kunnen dit natuurlijk doen met behulp van het oude java.util.Calendar.

De nieuwe API abstraheert echter de onderliggende logica met behulp van de vooraf gedefinieerde implementaties. Bezoek de Javadoc voor meer informatie.

4. Voorgedefinieerd Tijdregelaars

De klas Tijdregelaars heeft veel voorgedefinieerde statische methoden die een TemporalAdjuster object aan te passen Tijdelijk objecten op veel verschillende manieren, ongeacht de implementatie van Tijdelijk ze zijn misschien.

Hier is een korte lijst van deze methoden en een snelle definitie ervan:

  • dayOfWeekInMonth () - een regelaar voor de ordinale dag van de week. Bijvoorbeeld de datum van de tweede dinsdag in maart
  • firstDayOfMonth () - een expert voor de datum van de eerste dag van de huidige maand
  • firstDayOfNextMonth () - een expert voor de datum van de eerste dag van de volgende maand
  • firstDayOfNextYear () - een expert voor de datum van de eerste dag van het volgende jaar
  • firstDayOfYear () - een expert voor de datum van de eerste dag van het lopende jaar
  • lastDayOfMonth () - een expert voor de datum van de laatste dag van de huidige maand
  • volgendeOrSame () - een aanpasser voor de datum van de volgende keer dat een specifieke dag van de week voorkomt of dezelfde dag voor het geval dat vandaag overeenkomt met de vereiste dag van de week

Zoals we kunnen zien, zijn de namen van de methoden vrijwel vanzelfsprekend. Voor meer Tijdregelaars, bezoek de Javadoc.

Laten we beginnen met een eenvoudig voorbeeld - in plaats van een specifieke datum te gebruiken zoals in de voorbeelden, kunnen we gebruiken LocalDate.now () om de huidige datum uit de systeemklok te halen.

Maar voor deze tutorial gaan we een vaste datum gebruiken, zodat de tests later niet zullen mislukken als het verwachte resultaat verandert. Laten we eens kijken hoe we de Tijdregelaars klas om de datum van de zondag na 2017-07-08 te verkrijgen:

@Test openbare ongeldigheid whenAdjust_thenNextSunday () {LocalDate localDate = LocalDate.of (2017, 07, 8); LocalDate nextSunday = localDate.with (TemporalAdjusters.next (DayOfWeek.SUNDAY)); String verwacht = "2017-07-09"; assertEquals (verwacht, nextSunday.toString ()); }

Hier leest u hoe we de laatste dag van de huidige maand kunnen verkrijgen:

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

5. Aangepast definiëren TemporalAdjuster Implementaties

We kunnen ook onze aangepaste implementaties definiëren voor TemporalAdjuster. Dit kan op twee verschillende manieren.

5.1. Lambda-expressies gebruiken

Laten we eens kijken hoe we de datum kunnen verkrijgen die 14 dagen na 2017-07-08 ligt met behulp van de Temporal.with () methode:

@Test openbare ongeldigheid whenAdjust_thenFourteenDaysAfterDate () {LocalDate localDate = LocalDate.of (2017, 07, 8); TemporalAdjuster temporalAdjuster = t -> t.plus (Period.ofDays (14)); LocalDate resultaat = localDate.with (temporalAdjuster); String fourteenDaysAfterDate = "2017-07-22"; assertEquals (fourteenDaysAfterDate, result.toString ()); }

In dit voorbeeld gebruiken we een lambda-expressie en stellen we de temporalAdjuster bezwaar om 14 dagen toe te voegen aan de localDate object, dat de datum bevat (08-07-2017).

Laten we eens kijken hoe we de datum van de werkdag direct na 2017-07-08 kunnen verkrijgen door de onze te definiëren TemporalAdjuster implementaties met een lambda-expressie. Maar deze keer door de ofDateAdjuster () statische fabrieksmethode:

static TemporalAdjuster NEXT_WORKING_DAY = TemporalAdjusters.ofDateAdjuster (datum -> {DayOfWeek dayOfWeek = date.getDayOfWeek (); int daysToAdd; if (dayOfWeek == DayOfWeek.FRIDAY) daysToAddAdd = 3 ;Week if (dayOfWeek == DayOfWeek.FRIDAY) daysToAddAdd = 3 ;Week if (dayOfWeek ; else daysToAdd = 1; return today.plusDays (daysToAdd);});

Onze code testen:

@Test openbare ongeldigheid whenAdjust_thenNextWorkingDay () {LocalDate localDate = LocalDate.of (2017, 07, 8); TemporalAdjuster temporalAdjuster = NEXT_WORKING_DAY; LocalDate resultaat = localDate.with (temporalAdjuster); assertEquals ("2017-07-10", date.toString ()); }

5.2. Door het TemporalAdjuster Koppel

Laten we eens kijken hoe we een gewoonte kunnen schrijven TemporalAdjuster die de werkdag na 2017-07-08 verkrijgt door de implementatie van de TemporalAdjuster koppel:

public class CustomTemporalAdjuster implementeert 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; anders if (dayOfWeek == DayOfWeek.SATURDAY) daysToAdd = 2; anders dagenToAdd = 1; retourneer temporal.plus (daysToAdd, ChronoUnit.DAYS); }}

Laten we nu onze test uitvoeren:

@Test openbare leegte whenAdjustAndImplementInterface_thenNextWorkingDay () {LocalDate localDate = LocalDate.of (2017, 07, 8); CustomTemporalAdjuster temporalAdjuster = nieuwe CustomTemporalAdjuster (); LocalDate nextWorkingDay = localDate.with (temporalAdjuster); assertEquals ("2017-07-10", nextWorkingDay.toString ()); }

6. Conclusie

In deze tutorial hebben we laten zien wat TemporalAdjuster is, voorgedefinieerd Tijdelijke regelaars, hoe ze kunnen worden gebruikt en hoe we onze maatwerk kunnen implementeren TemporalAdjuster implementaties op twee verschillende manieren.

De volledige implementatie van deze tutorial is te vinden op GitHub.