Få ugenummer fra enhver dato

1. Introduktion

I denne artikel studerer vi flere muligheder, som vi kan bruge i Java til at få ugenummeret til en given dato. Vi starter med at se på et par muligheder for ældre kode ved hjælp af klasser forud for Java 8. Derefter ser vi på den nyere Date Time API i java.tid pakke, der blev introduceret i Java 8.

2. Før Java 8

Før Java 8 blev dato- og tidsberegninger udført hovedsageligt ved hjælp af Dato og Kalender klasser. Vi opretter typisk en Kalender, og så er det muligt at udtrække de oplysninger, vi har brug for, fra det ved hjælp af forskellige konstanter.

2.1. Få ugenummer ved hjælp Kalender Felter

Lad os se på vores første eksempel:

Kalenderkalender = Calendar.getInstance (landestandard); calendar.set (år, måned, dag); int weekOfYear = kalender.get (Calendar.WEEK_OF_YEAR);

Vi opretter simpelthen en Kalender eksempel for det givne Lokal og indstil år, måned og dag, og endelig får vi WEEK_OF_YEAR felt fra kalender objekt. Dette returnerer ugenummeret inden for det aktuelle år.

Lad os nu se på, hvordan man påberåber denne metode fra en af ​​vores enhedstest:

@Test offentlig ugyldighed givenDateUsingFieldsAndLocaleItaly_whenGetWeekNumber_thenWeekIsReturnedCorrectly () {Kalender kalender = Calendar.getInstance (Locale.ITALY); calendar.set (2020, 10, 22); assertEquals (47, calendar.get (Calendar.WEEK_OF_YEAR)); }

Vi er nødt til at være forsigtige, når vi anvender denne tilgang, da månedsfeltet i Kalender klasse er nulbaseret. Dette betyder, at hvis vi vil specificere december, er vi nødt til at bruge nummeret 11, hvilket ofte kan føre til forvirring.

2.2. Få ugenummer ved hjælp Lokal Opsætninger

I dette næstsidste eksempel ser vi på, hvad effekten af ​​at anvende nogle yderligere indstillinger på vores Kalender kan få:

Kalenderkalender = Calendar.getInstance (); calendar.setFirstDayOfWeek (firstDayOfWeek); calendar.setMinimalDaysInFirstWeek (minimalDaysInFirstWeek); calendar.set (år, måned, dag); int weekOfYear = kalender.get (Calendar.WEEK_OF_YEAR); 

Det Kalender klasse definerer to metoder:

  • setFirstDayOfWeek
  • setMinimalDaysInFirstWeek

Disse metoder har indflydelse på, hvordan vi beregner ugenummeret. Normalt er begge disse værdier taget fra Lokal når du opretter Kalender. Men det er også muligt at indstille den første dag i ugen og de minimale dage i den første uge af året manuelt.

2.3. Lokal Forskelle

Lokalitet spiller en vigtig rolle i, hvordan ugenummeret beregnes:

@Test offentlig ugyldighed givenDateUsingFieldsAndLocaleCanada_whenGetWeekNumber_thenWeekIsReturnedCorrectly () {Kalenderkalender = Calendar.getInstance (Locale.CANADA); calendar.set (2020, 10, 22); assertEquals (48, calendar.get (Calendar.WEEK_OF_YEAR)); } 

I denne enhedstest har vi kun ændret locale for Kalender at bruge Landestandard.CANADA i stedet for Lokal. ITALY og nu er ugenummeret returneret 48 i stedet for 47.

Begge resultater er korrekte. Som tidligere nævnt sker dette, fordi hver Lokal har forskellige indstillinger for setFirstDayOfWeek og setMinimalDaysInFirstWeek metoder.

3. Java 8 Dato tid API

Java 8 introducerede nye API'er til Dato og Tid for at afhjælpe de ældres mangler java.util.Date og java.util.Kalender.

I dette afsnit ser vi på nogle muligheder for at hente ugenummer fra datoen ved hjælp af denne nyere API.

3.1. Få ugenummer ved hjælp af de numeriske værdier

Ligeledes, som vi så før med Kalender, vi kan også overføre år-, måned- og dagværdier direkte til LocalDate:

LocalDate date = LocalDate.of (år, måned, dag); int weekOfYear = date.get (WeekFields.of (locale) .weekOfYear ()); 

Fordelen i forhold til vores eksempler før Java 8 er, at vi ikke har problemet med, at månedsfeltet er nulbaseret.

3.2. Få ugenummer ved hjælp Chronofield

I dette sidste eksempel ser vi, hvordan du bruger ChronoField optælling, som implementerer TemporalField interface:

LocalDate date = LocalDate.of (år, måned, dag); int weekOfYear = date.get (ChronoField.ALIGNED_WEEK_OF_YEAR); 

Dette eksempel ligner brugen af Kalender.WEEK_OF_YEARint konstant, som vi så tidligere, men brugte ChronoField.ALIGNED_WEEK_OF_YEAR.

4. Konklusion

I denne hurtige vejledning illustrerede vi flere måder at få ugenummeret fra en dato ved hjælp af almindelig Java.

Som altid er artiklens fulde kildekode tilgængelig på GitHub.