Newsgroup: it.comp.java
Titolo: risultato getTime() del Date dipende da timezone?

Ciao a tutti,
continuo a leggere in tutte le discussioni che il getTime() del date
(come il getTimeInMillis() del calendar) ritorna i millisecondi ed è
indipendente dal timezone della macchina su cui gira il software.
Questo lo dice anche i commenti sul metodo nel codice della sun.
Perchè sul mio PC, uso tomcat, se cambio da GMT+1 a GMT+3 i
millisecondi di una data fissa cambiano?
Abbiamo fatto sui server un cambio di OS: da windows a Linux. Windows
usava GMT+1 mentre Linux usa ECT. Ho un problema di millisecondi quando
la data del Date e' una data in cui vigeva l'ora legale... cosa c'è di
differente tra ECT e GMT+1?
Grazie a tutti,
Marco

 differente tra ECT e GMT+1?
ECT (o era CET?) è UTC+1 quando c'è l'ora solare e UTC+2 quando c'è l'ora
legale. Per cui fra ECT e UTC+1 c'è un'ora di differenza quando c'è l'ora
legale mentre sono identici quando c'è l'ora solare.
Ciao
---
http://www.mariottini.net/roberto/
SuperbCalc: 
http://www.mariottini.net/roberto/superbcalc/
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Ciao,
grazie per la risposta. Mi sembrava di aver capito che il getTime() era
indipendente dal timezone perchè nel date l'ora e' salvata in un solo
modo e solamente al momento dell'utilizzo (quindi visualizzazione)
vengono utilizzati i local settings.
Appurato invece che a seconda del timezone della macchina i
millisecondi cambiano, ho realizzato una funzione che converte una data
in un timezone in un'altra data di diverso timezone e ne restituisce i
millisecondi. Postate pure perplessità o miglioramenti possibili alla
funzione.
  public static long convertTimeZone (Date dateInput, TimeZone tInput,
TimeZone tOutput) {
	  long returnValue = 0;
	  TimeZone tzDefault = TimeZone.getDefault();
	  TimeZone.setDefault(tInput);
	  long msDataInput = dateInput.getTime();
	  long msDataUTC = msDataInput +
tInput.getOffset(dateInput.getTime());
	  TimeZone.setDefault(tOutput);
	  long msDataOutput = msDataUTC - tOutput.getOffset((new
Date()).getTime());
	  Date dateOutput = new Date(msDataOutput);
	  returnValue = dateOutput.getTime();
	  TimeZone.setDefault(tzDefault);
	  return returnValue;
  }
Grazie,
Marco
Roberto Mariottini ha scritto:


Ciao a tutt,
dovrei essere giunto ad una conclusione per il mio problema. Sebbene
entrambi i sistemi (Linux e Windows) utilizzano il timezone GMT+1 con
passaggio automatico all'ora legale, Linux utilizzando i local setting
di italia imposta Europe/Rome mentre Windows lascia Europe/Berlin.
Come data di test utilizzavo 15 luglio 1977 e ho scoperto dalle mie
ricerche che in germania l'ora legale e' cominciata nell'80. Per questo
Linux passava a CEST (ora legale italiana) mentre windows rimaneva in
CET (ora legale tedesca).
Riporto la funzione di conversione corretta:
  public static long convertTimeZone (Date dateInput, TimeZone tInput,
TimeZone tOutput) {
	  long returnValue = 0;
	  String tzDefaultID = new String(TimeZone.getDefault().getID());
	  TimeZone.setDefault(tInput);
	  long msDataInput = dateInput.getTime();
	  long msDataUTC = msDataInput +
tInput.getOffset(dateInput.getTime());
	  TimeZone.setDefault(tOutput);
	  long msDataOutput = msDataUTC -
tOutput.getOffset(dateInput.getTime());
	  Date dateOutput = new Date(msDataOutput);
	  returnValue = dateOutput.getTime();
	  TimeZone.setDefault(TimeZone.getTimeZone(tzDefaultID));
	  return returnValue;
  }
Ciao,
Marco
MCLI ha scritto:


  }
Io eviterei di cambiare i default, prova a guardare qui:
"Converting Times Between Time Zones"
http://javaalmanac.com/egs/java.util/GetTimeOtherZone2.html
--
Marco
-- 
Posted via a free Usenet account from 
http://www.teranews.com

Ciao,
non riesco a capire come mai mai questo modo a me non funziona... se
sono in Europe/Rome e voglio fare una data in altro timezone (tOutput)
devo cambiare il default altrimenti sfruttando il costruttore che
accetta il timezone a me non va...
	  Calendar cal = Calendar.getInstance(tOutput);
	  //Calendar cal = new GregorianCalendar(tOutput);
	  cal.setTime(new Date(77, 06, 15));
                 return cal.getTimeInMillis();
Sia usando il calendar che gregorianCalendar... a proposito... ma se
uso calendar utilizza di default gregorianCalendar?
ciao,
Marco
Marco Trevisan ha scritto:


   cal.setTime(new Date(77, 06, 15));
Per favore controlla le javadoc:
"Deprecated. As of JDK version 1.1, replaced by Calendar.set(year + 1900, month, date)
or GregorianCalendar(year + 1900, month, date)."
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Date.html#Date(int,%20int,%20int)
se noti in
http://javaalmanac.com/egs/java.util/GetTimeOtherZone2.html
non c'e' nessun "new Date"
Adatta un esempio che si trova al link precedente e poi ne riparliamo.


 "MCLI"  wrote ...


 anche se deprecati devo utilizzarli.
perche' non usi cal.setTime(dateInput) ?

 anche se deprecati devo utilizzarli.
No, non devi utilizzarli.
Calendar ha un metodo specifico setTime che accetta direttamente un
Date.
Occorre ricordarsi che Date rappresenta un istante di tempo espresso
come UTC. Qualsiasi conversione da/a giorno-mese-anno richiede la
specifica del calendario in base al quale tu vuoi fare la conversione.
Per questo i metodi i metodi getYear, getMonth, etc... sono deprecati e
non vanno utilizzati.