Spiegato il bug di getValue del Month in Java LocalDate

Tutti pensavano che la terza API date di Java ce l'avesse fatta. E invece no: Month.getValue() di LocalDate scarica sui dev un nuovo incubo di indicizzazione.

Output dell'enum Month di Java LocalDate che mostra lo sfasamento di indicizzazione tra getValue e ordinal

Key Takeaways

  • Month.getValue() di LocalDate è 1-based e rompe le tradizioni di indici zero-based sugli array.
  • Attieniti a ordinal() per compatibilità legacy; sottrai 1 da getValue() altrimenti.
  • Le API date di Java evolvono, ma gli standard pragmatici battono sempre i cambiamenti 'intuitivi'.

Java e le date. Che saga infinita. Ai tempi, contavamo che la classe Date originale funzionasse e basta: timestamp semplici, zero drammi. Invece è esplosa con le paure del Y2K e metodi assurdi, e i predecessori di Oracle ci hanno rifilato Calendar come salvatore. Buon tentativo, ma goffo. Ora arriva java.time.LocalDate come tentativo numero tre, acclamato come la soluzione a prova di bomba. Peccato che non lo sia. Non del tutto.

Cambio di paradigma totale? Macché. Scambia solo un mal di testa con un altro, costringendo i coder a sottrarre 1 ogni volta che prendono il nome del mese. E chi ci guadagna? Non tu, che fissi l’errore di indice sul tuo array alle 2 di notte.

Guardate, seguo Java dai tempi delle applet wars: 20 anni a guardare Sun, Oracle e ora Eclipse litigare sulla gestione. Le date sono sempre state il tallone d’Achille del linguaggio. Fusi orari che si spostano come politici, secondi intercalari che si intrufolano, e ogni iterazione dell’API finge di domare il caos. LocalDate? Moderna, immutabile, amica dell’ISO. Bella sulla carta. Ma guarda sotto il cofano Month.getMonth(), e il cinismo prende il sopravvento.

Perché il Month di LocalDate in Java parte a contare da 1?

Ecco il punto. Prendi LocalDate.now()—diciamo 2026-04-07, come nel reclamo originale. Chiama getMonth().getValue(), e zac: 4 per Aprile. Logico, no? Si allinea con ISO 8601, dove Gennaio è 1. I non-programmatori annuiscono compiaciuti. Ma noi programmatori? Siamo programmati per zero-based ovunque, da K&R e il suo C.

Il tuo fidato array di nomi mesi—Gennaio a 0, Febbraio a 1—finisce per non combaciare. Indici con getValue()? Atterri su Maggio invece di Aprile. Classico off-by-one, la piaga della nostra professione.

Data: 2026-04-07 Mese (val): Maggio Mese (ord): Aprile

Direttamente dal demo codice della fonte originale. Eseguito il 7 aprile, stampa Aprile correttamente con ordinal() (zero-based, indice 3). Ma getValue()? Richiede l’hack: MESES[fecha.getMonth().getValue() - 1]. Brutto. E ora incastonato in ogni nuovo codebase.

Ordinal() funziona ancora—meno male—mantenendo Gennaio=0. Ma perché dividere le acque? È come dare alla tua auto un cruscotto nuovo dove il contachilometri parte da 1 km. Intuitivo per i passeggeri, esasperante per i meccanici.

Ma Aspetta: E se il 1-based fosse Meglio?

Tempo di tabella. Presa e adattata dall’originale:

Metodo Basato su Esempio Concezione
getValue() 1 Gennaio == 1 Intuitiva
ordinal() 0 Gennaio == 0 Abituale

Punto valido. Gli umani contano Gennaio come 1. I bambini lo imparano così. Ma nel codice? La localtime() di C infila tm_mon da 0. Date.getMonth() di JavaScript? Zero-based, +1 per il display. Perl, PHP—stessa storia. Perfino il vecchio Calendar.get(Calendar.MONTH) era 0-11.

Spezzerà Questo il Tuo Vecchio Codice Java?

Risposta breve: Se stai migrando su java.time, sì—di soppiatto. Quel trucco rapido per i nomi mesi che tutti hanno copiato e incollato per decenni? Morto. Ti troverai a debuggare mesi spagnoli strani (o equivalenti inglesi) nei log. Prevedo un boom di lamentele su Stack Overflow entro il Q2 2025, man mano che i team aggiornano per Jakarta EE e dintorni.

Angolo unico che nessuno ha toccato: riecheggia le guerre ordinal() degli enum in Java 5. All’epoca, la gente urlava quando gli enum abbandonavano valori numerici per trucchi di reflection. Oracle non ha imparato niente. Inseguono la ‘purezza’—conformità ISO—a scapito di rotture pragmatiche. Chi ci guadagna? I consulenti Red Hat che fatturano audit sulle date. Il HotSpot JVM di Oracle? Si vende uguale.

E la fix al codice? Banale, ma pervasiva. Ogni tutorial, ogni classe utils—riscrivi. Nell’enterprise Java, dove le date infestano payroll e app di compliance, sono ore fatturabili. Il mio lato cinico dice: Perfetto. Tiene in moto l’economia Java.

Torniamo indietro nella storia. Struct tm di C99: tm_mon = 0-11, stamp

Priya Sundaram
Written by

Hardware and infrastructure reporter. Tracks GPU wars, chip design, and the compute economy.

Worth sharing?

Get the best AI stories of the week in your inbox — no noise, no spam.

Originally reported by Dev.to