Abrufen der Wochennummer von einem beliebigen Datum

1. Einleitung

In diesem Artikel werden verschiedene Optionen untersucht, die wir in Java verwenden können, um die Wochennummer für ein bestimmtes Datum abzurufen. Wir werden uns zunächst einige Optionen für Legacy-Code mit Klassen vor Java 8 ansehen. Anschließend werden wir uns die neuere Date Time API im java.time- Paket ansehen , das in Java 8 eingeführt wurde.

2. Vor Java 8

Vor Java 8 wurden Datums- und Zeitberechnungen hauptsächlich mit den Klassen Datum und Kalender durchgeführt . Normalerweise erstellen wir einen Kalender , und dann ist es möglich, die benötigten Informationen mithilfe verschiedener Konstanten daraus zu extrahieren.

2.1. Get Week - Nummer mit Kalender Feldern

Schauen wir uns unser erstes Beispiel an:

Calendar calendar = Calendar.getInstance(locale); calendar.set(year, month, day); int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);

Wir erstellen einfach eine Kalenderinstanz für das angegebene Gebietsschema und legen Jahr, Monat und Tag fest. Schließlich erhalten wir das Feld WEEK_OF_YEAR aus dem Kalenderobjekt . Dies gibt die Wochennummer innerhalb des aktuellen Jahres zurück.

Schauen wir uns nun an, wie Sie diese Methode aus einem unserer Unit-Tests aufrufen können:

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

Bei diesem Ansatz müssen wir vorsichtig sein, da das Monatsfeld in der Kalenderklasse auf Null basiert. Das heißt, wenn wir den Dezember angeben möchten, müssen wir die Nummer 11 verwenden, was häufig zu Verwirrung führen kann.

2.2. Abrufen der Wochennummer mithilfe von Gebietsschema- Setups

In diesem vorletzten Beispiel sehen wir uns an, wie sich das Anwenden einiger zusätzlicher Einstellungen auf unseren Kalender auswirken kann:

Calendar calendar = Calendar.getInstance(); calendar.setFirstDayOfWeek(firstDayOfWeek); calendar.setMinimalDaysInFirstWeek(minimalDaysInFirstWeek); calendar.set(year, month, day); int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR); 

Die Calendar- Klasse definiert zwei Methoden:

  • setFirstDayOfWeek
  • setMinimalDaysInFirstWeek

Diese Methoden wirken sich auf die Berechnung der Wochenzahl aus. Normalerweise werden diese beiden Werte beim Erstellen des Kalenders aus dem Gebietsschema übernommen . Es ist aber auch möglich, den ersten Tag in der Woche und die minimalen Tage in der ersten Woche des Jahres manuell einzustellen.

2.3. locale Unterschiede

Das Gebietsschema spielt eine wichtige Rolle bei der Berechnung der Wochenzahl:

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

In diesem Komponententest haben wir nur das Gebietsschema des Kalenders so geändert , dass Locale.CANADA anstelle von Locale.ITALY verwendet wird. Jetzt lautet die zurückgegebene Wochennummer 48 statt 47 .

Beide Ergebnisse sind korrekt. Wie bereits erwähnt, geschieht dies, weil jedes Gebietsschema unterschiedliche Einstellungen für die Methoden setFirstDayOfWeek und setMinimalDaysInFirstWeek hat .

3. Java 8 Date Time API

Java 8 führte neue APIs für Datum und Uhrzeit ein , um die Mängel der älteren java.util.Date und java.util.Calendar zu beheben .

In diesem Abschnitt werden einige Optionen zum Abrufen der Wochennummer vom Datum mithilfe dieser neueren API vorgestellt.

3.1. Ermitteln Sie die Wochennummer mithilfe der numerischen Werte

Wie wir bereits bei Calendar gesehen haben , können wir auch Jahres- , Monats- und Tageswerte direkt an LocalDate übergeben :

LocalDate date = LocalDate.of(year, month, day); int weekOfYear = date.get(WeekFields.of(locale).weekOfYear()); 

Der Vorteil gegenüber unseren Beispielen vor Java 8 besteht darin, dass wir nicht das Problem haben, dass das Monatsfeld auf Null basiert.

3.2. Holen Sie sich die Wochennummer mit Chronofield

In diesem letzten Beispiel sehen wir, wie die ChronoField- Aufzählung verwendet wird, die die TemporalField- Schnittstelle implementiert :

LocalDate date = LocalDate.of(year, month, day); int weekOfYear = date.get(ChronoField.ALIGNED_WEEK_OF_YEAR); 

Dieses Beispiel ähnelt der Verwendung der int- Konstante Calendar.WEEK_OF_YEAR , die wir zuvor gesehen haben, verwendet jedoch ChronoField.ALIGNED_WEEK_OF_YEAR .

4. Fazit

In diesem kurzen Tutorial haben wir verschiedene Möglichkeiten aufgezeigt, wie Sie die Wochennummer von einem Datum mit einfachem Java abrufen können.

Wie immer ist der vollständige Quellcode des Artikels auf GitHub verfügbar.