Ottenere il numero della settimana da qualsiasi data

1. Introduzione

In questo articolo, studieremo diverse opzioni che possiamo utilizzare in Java per ottenere il numero della settimana per una determinata data. Inizieremo esaminando alcune opzioni per il codice legacy che utilizza classi precedenti a Java 8. Successivamente, daremo un'occhiata alla più recente API Date Time nel pacchetto java.time che è stato introdotto in Java 8.

2. Prima di Java 8

Prima di Java 8, i calcoli di data e ora venivano eseguiti principalmente utilizzando le classi Date e Calendar . Tipicamente creiamo un calendario , quindi è possibile estrarne le informazioni di cui abbiamo bisogno utilizzando diverse costanti.

2.1. Ottieni il numero della settimana utilizzando i campi del calendario

Diamo un'occhiata al nostro primo esempio:

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

Creiamo semplicemente un'istanza di Calendar per le impostazioni locali specificate e impostiamo l'anno, il mese e il giorno e, infine, otteniamo il campo WEEK_OF_YEAR dall'oggetto calendario . Ciò restituirà il numero della settimana entro l'anno corrente.

Ora, diamo un'occhiata a come richiamare questo metodo da uno dei nostri unit test:

@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)); }

Dobbiamo fare attenzione quando si adotta questo approccio, poiché il campo del mese nella classe Calendar è a base zero. Ciò significa che se vogliamo specificare dicembre, dobbiamo usare il numero 11, che spesso può portare a confusione.

2.2. Ottieni il numero della settimana utilizzando le impostazioni locali

In questo penultimo esempio, daremo un'occhiata a quale effetto può avere l' applicazione di alcune impostazioni aggiuntive al nostro calendario :

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

La classe Calendar definisce due metodi:

  • setFirstDayOfWeek
  • setMinimalDaysInFirstWeek

Questi metodi hanno un impatto sul modo in cui calcoliamo il numero della settimana. Normalmente, entrambi questi valori vengono presi dalle impostazioni internazionali durante la creazione del calendario . Ma è anche possibile impostare manualmente il primo giorno della settimana e i giorni minimi nella prima settimana dell'anno.

2.3. Differenze locali

Le impostazioni locali giocano un ruolo importante nel modo in cui viene calcolato il numero della settimana:

@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 questo unit test, abbiamo modificato solo le impostazioni internazionali del calendario per utilizzare Locale.CANADA invece di Locale.ITALY e ora il numero della settimana restituito è 48 invece di 47 .

Entrambi i risultati sono corretti. Come accennato in precedenza, ciò accade perché ogni Locale ha impostazioni diverse per i metodi setFirstDayOfWeek e setMinimalDaysInFirstWeek .

3. API Java 8 Date Time

Java 8 ha introdotto nuove API per data e ora per risolvere le carenze dei vecchi java.util.Date e java.util.Calendar .

In questa sezione, daremo un'occhiata ad alcune opzioni per ottenere il numero della settimana dalla data utilizzando questa nuova API.

3.1. Ottieni il numero della settimana utilizzando i valori numerici

Allo stesso modo, come abbiamo visto prima con Calendar , possiamo anche trasferire i valori di anno, mese e giorno direttamente in LocalDate :

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

Il vantaggio rispetto ai nostri esempi precedenti a Java 8 è che non abbiamo il problema del campo del mese a base zero.

3.2. Ottieni il numero della settimana utilizzando Chronofield

In questo esempio finale vedremo come utilizzare l' enumerazione ChronoField , che implementa l' interfaccia TemporalField :

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

Questo esempio è simile all'utilizzo della costante int Calendar.WEEK_OF_YEAR che abbiamo visto in precedenza, ma utilizzando ChronoField.ALIGNED_WEEK_OF_YEAR .

4. Conclusione

In questo breve tutorial, abbiamo illustrato diversi modi per ottenere il numero della settimana da una data utilizzando Java semplice.

Come sempre, il codice sorgente completo dell'articolo è disponibile su GitHub.