Få ukenummer fra hvilken som helst dato

1. Introduksjon

I denne artikkelen vil vi studere flere alternativer som vi kan bruke i Java for å få ukenummer for en gitt dato. Vi begynner med å se på noen alternativer for eldre kode ved bruk av klasser før Java 8. Deretter tar vi en titt på den nyere Date Time API i java.time pakken som ble introdusert i Java 8.

2. Før Java 8

Før Java 8 ble dato- og tidsberegninger hovedsakelig utført ved hjelp av Dato og Kalender klasser. Vanligvis lager vi en Kalender, og da er det mulig å hente ut informasjonen vi trenger fra den ved å bruke forskjellige konstanter.

2.1. Få ukenummer ved å bruke Kalender Enger

La oss se på vårt første eksempel:

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

Vi oppretter ganske enkelt en Kalender eksempel for det gitte Lokal og angi år, måned og dag, og til slutt får vi WEEK_OF_YEAR felt fra kalender gjenstand. Dette vil returnere ukenummeret i inneværende år.

La oss nå se på hvordan vi kan påkalle denne metoden fra en av enhetstestene våre:

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

Vi må være forsiktige når vi bruker denne tilnærmingen, som månedsfelt i Kalender klasse er nullbasert. Dette betyr at hvis vi vil spesifisere desember, må vi bruke nummeret 11, som ofte kan føre til forvirring.

2.2. Få ukenummer ved å bruke Lokal Oppsett

I dette nest siste eksemplet ser vi på hva effekten av å bruke noen ekstra innstillinger på Kalender kan ha:

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

De Kalender klasse definerer to metoder:

  • setFirstDayOfWeek
  • setMinimalDaysInFirstWeek

Disse metodene har innvirkning på hvordan vi beregner ukenummeret. Normalt er begge disse verdiene hentet fra Lokal når du oppretter Kalender. Men det er også mulig å stille den første dagen i uken og de minimale dagene i den første uken i året manuelt.

2.3. Lokal Forskjeller

Lokalitet spiller en viktig rolle i hvordan ukenummeret beregnes:

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

I denne enhetstesten har vi bare endret lokaliteten til Kalender å bruke Lokalitet.CANADA i stedet for Lokal. ITALY og nå er ukenummeret returnert 48 i stedet for 47.

Begge resultatene stemmer. Som nevnt tidligere skjer dette fordi hver Lokal har forskjellige innstillinger for setFirstDayOfWeek og setMinimalDaysInFirstWeek metoder.

3. Java 8 Dato tid API

Java 8 introduserte nye APIer for Dato og Tid for å løse manglene til de eldre java.util.Date og java.util.Kalender.

I denne delen tar vi en titt på noen alternativer for å få ukenummer fra datoen ved hjelp av dette nyere API.

3.1. Få ukenummer ved hjelp av de numeriske verdiene

På samme måte, som vi så før med Kalender, kan vi også overføre verdier for år, måned og dag direkte til LocalDate:

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

Fordelen med eksemplene våre før Java 8 er at vi ikke har problemet med at månedsfeltet er nullbasert.

3.2. Få ukenummer ved å bruke Chronofield

I dette siste eksemplet ser vi hvordan du bruker ChronoField oppregning, som implementerer TemporalField grensesnitt:

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

Dette eksemplet ligner på å bruke Kalender.WEEK_OF_YEARint konstant som vi så tidligere, men brukte ChronoField.ALIGNED_WEEK_OF_YEAR.

4. Konklusjon

I denne raske opplæringen illustrerte vi flere måter å få ukenummeret fra en dato ved hjelp av vanlig Java.

Som alltid er hele kildekoden til artikkelen tilgjengelig på GitHub.


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