Het weeknummer van elke datum ophalen

1. Inleiding

In dit artikel zullen we verschillende opties bestuderen die we in Java kunnen gebruiken om het weeknummer voor een bepaalde datum te krijgen. We beginnen met het bekijken van enkele opties voor verouderde code met klassen vóór Java 8. Daarna bekijken we de nieuwere Date Time API in de java.time pakket dat is geïntroduceerd in Java 8.

2. Voor Java 8

Vóór Java 8 werden datum- en tijdberekeningen voornamelijk uitgevoerd met behulp van de Datum en Kalender klassen. Meestal maken we een Kalender, en dan is het mogelijk om de informatie die we nodig hebben eruit te halen door verschillende constanten te gebruiken.

2.1. Krijg weeknummer met behulp van Kalender Velden

Laten we naar ons eerste voorbeeld kijken:

Calendar calendar = Calendar.getInstance (locale); calendar.set (jaar, maand, dag); int weekOfYear = calendar.get (Calendar.WEEK_OF_YEAR);

We maken gewoon een Kalender bijvoorbeeld voor het gegeven Locale en stel het jaar, de maand en de dag in, en als laatste krijgen we de WEEK_OF_YEAR veld uit de kalender voorwerp. Hiermee wordt het weeknummer binnen het huidige jaar geretourneerd.

Laten we nu eens kijken hoe u deze methode kunt gebruiken in een van onze unit-tests:

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

We moeten voorzichtig zijn bij het toepassen van deze benadering, aangezien het maandveld in de Kalender klasse is op nul gebaseerd. Dit betekent dat als we december willen specificeren, we het nummer 11 moeten gebruiken, wat vaak tot verwarring kan leiden.

2.2. Krijg weeknummer met behulp van Locale Opstellingen

In dit voorlaatste voorbeeld bekijken we wat het effect is van het toepassen van enkele aanvullende instellingen op onze Kalender kan hebben:

Calendar calendar = Calendar.getInstance (); calendar.setFirstDayOfWeek (firstDayOfWeek); calendar.setMinimalDaysInFirstWeek (minimalDaysInFirstWeek); calendar.set (jaar, maand, dag); int weekOfYear = calendar.get (Calendar.WEEK_OF_YEAR); 

De Kalender class definieert twee methoden:

  • setFirstDayOfWeek
  • setMinimalDaysInFirstWeek

Deze methoden hebben invloed op de manier waarop we het weeknummer berekenen. Normaal gesproken worden beide waarden overgenomen uit de Locale bij het maken van de Kalender. Maar het is ook mogelijk om de eerste dag van de week en de minimale dagen in de eerste week van het jaar handmatig in te stellen.

2.3. Locale Verschillen

De landinstelling speelt een belangrijke rol in de manier waarop het weeknummer wordt berekend:

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

In deze unit-test hebben we alleen de landinstelling van het Kalender gebruiken Lokaal.CANADA in plaats van Locale.ITALY en nu is het teruggekeerde weeknummer 48 in plaats van 47.

Beide resultaten zijn correct. Zoals eerder vermeld, gebeurt dit omdat elk Locale heeft verschillende instellingen voor de setFirstDayOfWeek en setMinimalDaysInFirstWeek methoden.

3. Java 8 Datum Tijd API

Java 8 introduceerde nieuwe API's voor Datum en Tijd om de tekortkomingen van ouderen aan te pakken java.util.Date en java.util.Calendar.

In dit gedeelte zullen we enkele opties bekijken om het weeknummer vanaf de datum te krijgen met behulp van deze nieuwere API.

3.1. Haal het weeknummer op met behulp van de numerieke waarden

Evenzo, zoals we eerder zagen met Kalender, kunnen we ook jaar-, maand- en dagwaarden rechtstreeks doorgeven aan LocalDate:

LocalDate date = LocalDate.of (jaar, maand, dag); int weekOfYear = date.get (WeekFields.of (locale) .weekOfYear ()); 

Het voordeel ten opzichte van onze pre-Java 8-voorbeelden is dat we niet het probleem hebben dat het maandveld op nul is gebaseerd.

3.2. Krijg weeknummer met behulp van Chronofield

In dit laatste voorbeeld zullen we zien hoe u de ChronoField opsomming, die de TemporalField koppel:

LocalDate date = LocalDate.of (jaar, maand, dag); int weekOfYear = date.get (ChronoField.ALIGNED_WEEK_OF_YEAR); 

Dit voorbeeld is vergelijkbaar met het gebruik van de Agenda.WEEK_OF_YEARint constante die we eerder zagen, maar met ChronoField.ALIGNED_WEEK_OF_YEAR.

4. Conclusie

In deze korte tutorial hebben we verschillende manieren geïllustreerd om het weeknummer van een datum te krijgen met behulp van gewoon Java.

Zoals altijd is de volledige broncode van het artikel beschikbaar op GitHub.