Newsgroup: it.comp.java
Titolo: Differenza di comportamento tra windows e linux

Ciao,
vorrei che provaste ad esequire il codice che segue sia su piattaforma
win che linux. Io ho provato con la jvm della Sun. Vorrei che mi
diceste se quello che io considero un bug sia mai stato messo in
evidenza. Non ho trovato nulla di significativo in rete.
int year;
int month;
int day;
java.util.GregorianCalendar gc = new java.util.GregorianCalendar(1966,
        java.util.GregorianCalendar.MAY, 21);
year = gc.get(java.util.GregorianCalendar.YEAR);
month = gc.get(java.util.GregorianCalendar.MONTH) + 1;
day = gc.get(java.util.GregorianCalendar.DATE);
System.out.println("gc1: " + year + "-" + month + "-" + day);
gc.add(java.util.GregorianCalendar.DATE, 1);
year = gc.get(java.util.GregorianCalendar.YEAR);
month = gc.get(java.util.GregorianCalendar.MONTH) + 1;
day = gc.get(java.util.GregorianCalendar.DATE);
System.out.println("gc2: " + year + "-" + month + "-" + day);
grazie,
SFD

 
non dici che problema incontri
comunque ti ho fatto la prova e ovviamente sia in linux che in winzoz mi torna
gc1: 1966-5-21
gc2: 1966-5-22
dai una spolverata al pc, forse c'è qualche sorcio

 evidenza. Non ho trovato nulla di significativo in rete.
giambo@deimos tmp $ java -version
java version "1.4.2-gentoo"
Java(TM) 2 Runtime Environment, Standard Edition (build
1.4.2-gentoo-1095597100)
Java HotSpot(TM) Client VM (build 1.4.2-gentoo-1095597100, mixed mode)
giambo@deimos tmp $ javac SFD.java ; java SFD
gc1: 1966-5-21
gc2: 1966-5-22
giambo@deimos tmp $ java -version
java version "1.4.1"
Java(TM) 2 Runtime Environment, Standard Edition (build Blackdown-1.4.1-01)
Java HotSpot(TM) Client VM (build Blackdown-1.4.1-01, mixed mode)
giambo@deimos tmp $ javac SFD.java ; java SFD
gc1: 1966-5-21
gc2: 1966-5-22
giambo@deimos tmp $ java -version
java version "1.4.2-rc1"
Java(TM) 2 Runtime Environment, Standard Edition (build Blackdown-1.4.2-rc1)
Java HotSpot(TM) Client VM (build Blackdown-1.4.2-rc1, mixed mode)
giambo@deimos tmp $ javac SFD.java ; java SFD
gc1: 1966-5-21
gc2: 1966-5-22
Che problema c'e' ?
-- 
Giambo - Occhio al filtro antispam _e_ alla whitelist !

 Che problema c'e' ?
avete ragione cari miei, sono stato piuttosto avaro di particolari:
su win2k:
C:\>java -version
java version "1.4.2_02"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_02-b03)
Java HotSpot(TM) Client VM (build 1.4.2_02-b03, mixed mode)
e l'output dà 
gc1: 1966-5-21
gc2: 1966-5-22
su linux (Linux sfdpc 2.6.3 #1 Sun Apr 11 14:03:12 CEST 2004 i686 unknown):
sfd@sfdpc:~/Projects/java/GregorianCalendar$ java -version
java version "1.4.2"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-b28)
Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)
e l'output è
gc1: 1966-5-21
gc2: 1966-5-21
grazie
SFD

...

bel casino, non so come aiutarti
ma che succede se sommi 2 oppure 3 ?
mangia sempre e soltanto un giorno ?
fa lo stesso anche se cambi l'orario (es, portandolo alle 23.. prima
di fare la add) ?
spesso su linux gli utenti hanno le impostazioni dell'orario
sbagliata, ma da qui a che java mangi un giorno....
probabilmente la runtime fa i conti portando tutto in millisecondi, e
se mangia solo un giorno vuol dire che non riesce a scavallare le 24
con quanto aggiunge.
è come se dal sistema gli tornino zero millisecondi e aggiungendo
quanto dovrebbe bastare si ritrova sempre nello stesso giorno, mentre
se ne sommi 2 ne salta uno solo.
boooo
prova a verificare che le impostazioni della data e ora siano corrette

 bel casino, non so come aiutarti
provando il seguente:
class ProvaGregorian {
    public void runGregorian(int anno, int mese, int giorno) {
       int year;
       int month;
       int day;
      java.util.GregorianCalendar gc = new
java.util.GregorianCalendar(anno, mese, giorno);
      year = gc.get(java.util.GregorianCalendar.YEAR);
      month = gc.get(java.util.GregorianCalendar.MONTH) + 1;
      day = gc.get(java.util.GregorianCalendar.DATE);
      System.out.println("gc1: " + year + "-" + month + "-" + day);
      long prima = gc.getTimeInMillis();
      System.out.println("prima: " + gc.getTimeInMillis());
      gc.add(java.util.GregorianCalendar.DATE, 1);
      year = gc.get(java.util.GregorianCalendar.YEAR);
      month = gc.get(java.util.GregorianCalendar.MONTH) + 1;
      day = gc.get(java.util.GregorianCalendar.DATE);
      System.out.println("gc2: " + year + "-" + month + "-" + day);
      long dopo = gc.getTimeInMillis();
      System.out.println("dopo: " + gc.getTimeInMillis());
      System.out.println("differenza: " + (dopo - prima) + "\n");
   }
   public static void main(String[] argv) {
     ProvaGregorian prova = new ProvaGregorian();
     prova.runGregorian(1966, java.util.GregorianCalendar.MAY, 21);
     prova.runGregorian(1966, java.util.GregorianCalendar.MAY, 20);
     prova.runGregorian(1966, java.util.GregorianCalendar.MAY, 22);
  }
}
ottengo:
gc1: 1966-5-21
prima: -
114138000000
gc2: 1966-5-21
dopo: -
114055200000
differenza: 82800000
gc1: 1966-5-20
prima: -114224400000
gc2: 1966-5-21
dopo: -
114138000000
differenza: 86400000
gc1: 1966-5-22
prima: -114051600000
gc2: 1966-5-23
dopo: -113965200000
differenza: 86400000
interessante, no? inoltre sommando un numero di giorni pari a 2 o più
il problema scompare
SFD

 SFD
che vuol dire che se se sommi 2 è corretto ?
ovviamente il problema ce l'hai usando qualsiasi giorno di partenza
vero ?
86400000 - 82800000 fa 3600000 che sono i millisecondi rappresentatnti
un ora
quindi per quanto mi riguarda sono sempre convinto che hai le
impostazioni della data cannate a tal punto da trarre in inganno la vm
è come se partisse da -1 ora a fare i conti e sommando il primo giorno
non scavalla le 24
forse il problema lo innesca non tanto la vm, quanto la parte linux
che gli comunica l'orario
questi sono i parametri del file "clock" del mio linux:
HWCLOCK="--localtime"
TIMEZONE="Europe/Rome"
DEFAULT_TIMEZONE="Europe/Rome"
io ho la suse e ce l'ho sotto /etc/sysconfig, te cercalo nel tuo
sistema
e questo (molto importante) è quello che ho in etc/adjtime:
4.302295 1100282783 0.000000
1100247176
LOCAL
se il tuo pc ha il doppio boot (winzoz linux) allora questi due file
devono essere identici a quelli miei
inoltre devi avere attivi due script: boot.clock in avvio ed un'altro
in chiusura che servono a linux per fasare l'orario con il bios
ciao

 in chiusura che servono a linux per fasare l'orario con il bios
mh, in realtà utilizzo solo debian (niente dual con altri sysops) e il
mio orologio è più che bene configurato. Il problema si verifica anche
su altri pc, analogo al mio.
SFD