Newsgroup: it.comp.java
Titolo: Un bug in GregorianCalendar?

Salve, avevo bisogno di un metodino che mi estraesse per un dato mese
di un dato anno il suo "giorno massimo". Chiaramente l'anno serve per
febbraio.
Nello spirito della riusabilità (lo so che a farlo da me ci volevano
quattro righe in croce) ho cercato di ottenerlo con le Api Sun e quello
che segue è il risultato:
int year = .... ;
System.out.println(new
GregorianCalendar(year,GregorianCalendar.FEBRUARY,1).getActualMaximum(GregorianCalendar.DAY_OF_MONTH));
Chiaramente l'ho subito testato per Febbraio.
Per year = 2005 ha restituito correttamente 28;
Per year = 2004 ha restituito correttamente 29;
Per year = 2000 ha restituito NON correttamente 29;
Sono bisestili, come ricorderete gli anni divisibili per 4 ma NON per
400.
Che ne pensate?

 Che ne pensate?
mi pare che esisteva il 29 Febbraio 2000, ho soltanto visto su google che
c'erano degli esami universitari in quella data
 
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

No, sono sicuro. Modificai più di un programma per questo motivo.

Postilla: dà lo stesso errore anche il costruttore che per
new GregorianCalendar(2000,GregorianCalendar.FEBRUARY,29)
non va in java.lang.IllegalArgumentException

>Che ne pensate?
Che nell'anno 2000 esisteva il 29 febbraio !!!
Sono bisestili tutti gli anni le divisibili per 4, tranne divisibili
per cento, fatta eccezione per quelli divisibili per 400 che invece
sono bisestili !
Se hai dubbi basta che tu apra il calendario di Windows...

 
A me risulta il contrario:
(da 
http://www.comitatoanno2000.it/domandee.htm#gregor
)
Dalla Bolla "Inter gravissimas" (1582) di Papa Gregorio XIII :
"9. Deinde, ne in posterum a XII Kalendas Aprilis æquinoctium recedat, statuimus 
bissextum quarto quoque anno (uti mos est) continuari debere, præterquam in 
centesimis annis; qui, quamvis bissextiles antea semper fuerint, qualem etiam 
esse volumus annum MDC, post eum tamen qui deinceps consequentur centesimi non 
omnes bissextiles sint, sed in quadringentis quibusque annis primi quique tres 
centesimi sine bissexto transigantur, quartus vero quisque centesimus 
bissextilis sit, ita ut annus MDCC, MDCCC, MDCCCC bissextiles non sint. Anno 
vero MM, more consueto dies bissextus intercaletur, Februario dies XXIX 
continente, idemque ordo intermittendi intercalandique bissextum diem in 
quadringentis quibusque annis perpetuo conservetur. "
Che traducendo diventa:
"E infine, ad evitare per il futuro che l’equinozio si allontani dal 21 di 
marzo, stabiliamo che (come già si fa) si continui ad avere un anno bisestile in 
ogni gruppo di quattro anni, a meno che non si tratti dell’anno terminale di 
ogni secolo (il centesimo): questi anni finali di secolo, anche se prima d’ora 
sono sempre stati bisestili , e così vogliamo che rimanga ancora l’anno 1600, 
successivamente però non lo saranno tutti, ma per ogni gruppo di quattrocento 
anni i primi tre anni centesimi non saranno bisestili, mentre lo sarà il quarto, 
cosicché gli anni 1700, 1800 e 1900 non lo saranno e invece l’anno 2000 sarà un 
anno bisestile, col mese di febbraio di 29 giorni, e questo stesso modello dovrà 
ripetersi identico ogni quattrocento anni, per sempre."
Saluti
Roberto

 No, sono sicuro. Modificai più di un programma per questo motivo.
E allora rimodificalo :)
400 è l'eccezione di quelli divisibili per 100 (che non sono bisestili
anche se divisibili per 4), quindi è bisestile.
vedi che usare le API conviene? ;)
uL
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Per year = 2000 ha restituito NON correttamente 29;
E invece è corretto (dov'eri nel 2000? ;-))
Sono bisestili gli anni divisibili per 4, con eccezione degli anni
divisibili per 100 ma escludendo quelli divisibili per 400.

Arghhh...ora che me l'avete scritta me la sono ricordata
(correttamente) anche io. E mi sono ricordato che la correzione che
feci all'epoca era proprio perchè chi aveva fatto il calcolo del
bisestile aveva assegnato "28" ai divisibili per 100 nessuno escluso.
Tanto per la cronaca, il metodino di cui sopra, ritorna correttamente
"28" per il 2100...
Ciao e grazie.

 uL
Nicola


Un mese è all'incirca il periodo di rivoluzione della luna attorno
alla terra. That'all...:-)

 (correttamente) anche io. 
Dai, tanto il prossimo anno che fa eccezione è il 2100, e l'eccezione
dell'eccezione è il 2400: si potrebbe lasciare ai posteri qualcosa da
fare, modello millennium bug! ;)


 all'incirca
Direi ottima base per un sistema metrico
:)


ok. allora dì alla sun corporation di buggare la GregorianCalendar (ma
nel 2100 Java si userà ancora?)...:-)
Fuori dalla battuta, se fosse stato un bug, si sarebbe dovuto
correggere perchè non troverei nulla di strano a sapere di
applicazioni che utilizzano dati relativi a date antecedenti oggi (per
non parlare di migrazioni di basi dati preeesistenti).

 corretta.
Queste correzioni non sono dovute ad "errori della sua estrosa scelta", 
ma al fatto che l'anno solare (la rivoluzione della terra intorno al 
sole) non dura esattamente 365 rotazioni della terra.

 sole) non dura esattamente 365 rotazioni della terra.
Cio' non spiega assolutamente la scelta
di
12 ??
mesi dimensione variabile
28-31 ???
che hanno poi condizionato tutta l'aritmetica delle date
La mia unica spiegazione e' che dopo un orgia di vino e altro si e' messo a
dire
28
31
30
31
31
....


 28-31 ???
Da quel poco che ricordo i mesi erano inizialmente 10 (ti sei mai 
chiesto perché gli ultimi sono settembre, ottobre, novembre e 
dicembre?). Luglio e Agosto furono aggiunti successivamente (può essere 
proprio da papa Gregorio?) non ricordo per quali motivi, in onore a 
Giulio Cesare (Julius) e Augusto (Augustus).
La scelta di dieci può essere più plausibile, dato che abbiamo dieci 
dita nelle mani e adottiamo il sistema decimale :)
pole
-- 
ammentos - a lightweight persistence framework for JDK5
http://www.sourceforge.net/projects/ammentos
http://ammentos.biobytes.it

 28-31 ???
Non ne ho idea. Io confutavo l'affermazione in cui sostenevi che le 
regole dell'anno bisestile fossero per correggere un errata suddivisione 
dell'anno.
Comunque lo suddividi devi sempre recuperare un giorno ogni quattro anni 
con le eccezioni descritte, se non vuoi trovarti un calendario sfalzato 
nel tempo.

 dita nelle mani e adottiamo il sistema decimale :)
Vabbé ho fatto un po' di confusioni storiche ma il fatto dei dieci mesi 
iniziali è confermato: :)
http://it.wikipedia.org/wiki/Calendario_giuliano


 alla terra. That'all...:-)
A questo punto fai 13 mesi da 28
-- 
Manny Calavera
Mail to: anforagimailpuntocom²

 A questo punto fai 13 mesi da 28
Che pero' e' un numero primo. 12 ha il vanaggio di essere divisibile per 
2, 3, 4 e 6: Meta' anno, 3 quadrimestri, quattro stagioni da 3 mesi, 
... Per la stessa ragione il giorno e' diviso in 24 (12*2) ore e la 
circonferenza in 360 gradi (3*12*10 - piu' o meno i giorni dell'anno).
Questa era la spiegazione che ricevetti taaaaaaaaanti anni fa' ... Ma 
forse chi me la diede (Un certo John Nash) era semplicemente un fanatico 
dei numeri :)
-- 
Giambo - Occhio al filtro antispam _e_ alla whitelist !

 circonferenza in 360 gradi (3*12*10 - piu' o meno i giorni dell'anno).
I dodici mesi vengono dal calendario civile romano: come tutti sanno
nacque di 10 mesi e iniziava a marzo, perň era solo di 304 giorni e, di
conseguenza, scazzava alla grande le stagioni. Numa Pompilio aggiunse i
due mesi e lo portň a 355 giorni, equivalente a circa 12 fasi lunari.
Per allineare l'anno civile all'anno solare, ogni due anni veniva
aggiunto un tredicesimo mese.
Giulio cesare fece la riforma piů sostanziale (calendario Giuliano)
portando l'anno civile allineato all'anno solare, con 365 giorni e la
regola dell'anno bisestile. Inoltre, i mesi erano alternativamente di 30
e 31 giorni con l'eccezione di febbraio che ne aveva 29 (e 30 negli anni
bisestili). Ricordiamo che l'anno romano iniziava a marzo, quindi la
scelta era giustificata dal fatto che febbraio era l'ultimo mese.
Augusto a sua volta ci mise del suo: cambiň il nome del suo mese di
nascita da sestilis a augustus, inoltre volle portarlo a 31 giorni come
il mese di giulio cesare (julius) togliendo un'altro giorno a febbraio e
fu cambiato anche il numero di giorni dei mesi successivi per evitare
che ci fossero tre mesi consecutivi di 31 giorni. Praticamente questa č
la situazione odierna.
Molto tempo dopo si perfezionň (finalmente) l'allineamento del
calendario civile con il calendario solare, introducendo le famose
regole degli anni bisestili nei 100 e 400 anni. Questo č il calendario
Gregoriano (dal papa Gregorio XII che fece la riforma).
In definitiva, i dodici mesi hanno una semplice ragione storica, legata
inizialmente ad un approssimativo allineamento alle fasi lunari. E non
da una bizzarria di papa Gregorio XII come qualcuno ha sostenuto :-)

Il 29 febbraio 2000 è esistito...
Infatti la regola è la seguente: sono bisestili gli anni multipli di 4
ma non di 100, più quelli multipli di 400.
Ovvero boolean bisestile = (anno % 400 == 0) || (anno % 4 == 0 && anno
% 100 != 0) 
Il problema era nell'algoritmo... :-)

 
Speriamo che nel 2100 al computer si possa chiedere 'il 2000 era 
bisestile?' e anche 'controlla un pò se hai un baco nel calcolo delle 
date' ! (Avete presente in Star Trek IV quando Scotty tenta di parlare 
ad un Apple usando il mouse come microfono?) :-)
bye
DKano