Discussione:
Fusi orari
(troppo vecchio per rispondere)
GLuca
2009-03-17 08:49:01 UTC
Permalink
buongiorno a tutti

ho il seguente problema,
sono su un server italiano sul quale gira un applicativo che mantiene su un
database una serie di eventi in diverse nazioni.
Ad esempio DataEvento, Descrizione evento e Nazione(Città) evento.
Dovrei in un determinato istante sapere se un evento è già passato o meno e
quì entrano in gioco i fusi orari nel senso che se sul mio server italiano
sono le 13/06/2009 10:30, un evento in spagna alla stessa data non è ancora
passato mentre in afganistan si. In pratica (per semplificare), avrei bisogno
di una funzione che dato un Datetime, una nazione di partenza(o meglio ancora
una città) e una nazione di arrivo mi dia la data e orario corrispondente
della nazione di arrivo.
Esiste qualcosa nel framework 3.5 SP1 che faccia al caso mio o avete qualche
soluzione da suggerirmi?

ciao e grazie
Matteo Migliore
2009-03-17 09:38:48 UTC
Permalink
Post by GLuca
Esiste qualcosa nel framework 3.5 SP1 che faccia al caso mio o avete qualche
soluzione da suggerirmi?
La cosa più semplice è gestire *solo* DateTime di tipo UTC:
http://msdn.microsoft.com/en-us/library/system.datetime.utcnow.aspx
Post by GLuca
ciao e grazie
Prego! ;-)

--
Matteo Migliore
http://blogs.ugidotnet.org/matteomigliore
GLuca
2009-03-17 12:14:01 UTC
Permalink
Post by Matteo Migliore
Post by GLuca
Esiste qualcosa nel framework 3.5 SP1 che faccia al caso mio o avete qualche
soluzione da suggerirmi?
http://msdn.microsoft.com/en-us/library/system.datetime.utcnow.aspx
Post by GLuca
ciao e grazie
Prego! ;-)
--
Matteo Migliore
http://blogs.ugidotnet.org/matteomigliore
Ciao Matteo, grazie mille per la risposta.
Non ho capito come posso applicarlo al mio caso. Ad esempio,
dall'interfaccia web per il censimento degli eventi inserisco "13/06/2009
10:30 Madrid Evento1". Questo record viene inserito sul mio server in italia.
Come dovrei salvare la data e l'orario in modo tale che quando sul server
sono le 13/06/2009 10:30(italiane) posso confrontare la data dell'evento
tendendo conto del fuso diverso?

Ciao e grazie
Matteo Migliore
2009-03-17 19:28:02 UTC
Permalink
Post by GLuca
Non ho capito come posso applicarlo al mio caso. Ad esempio,
dall'interfaccia web per il censimento degli eventi inserisco "13/06/2009
10:30 Madrid Evento1". Questo record viene inserito sul mio server in italia.
Quando salvi il record, l'ora che inserisci è UTC quindi indipendente
dal fusorario, poi in un campo separato puoi salvare il GMT (+1, +2, -3
etc...)
oppure la nazione, in questo modo tutti i campi DateTime sul DB
sono riferiti a GMT 0.

Chiaro?
Post by GLuca
Come dovrei salvare la data e l'orario in modo tale che quando sul server
sono le 13/06/2009 10:30(italiane) posso confrontare la data dell'evento
tendendo conto del fuso diverso?
In C#:
--------------------------------------
DateTime date = new DateTime(2009, 12, 10, 10, 20, 10);
int gmt = (date - date.ToUniversalTime()).Hours;
--------------------------------------

Su MSDN, DateTime.ToUniversalTime:
http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime.aspx
Post by GLuca
Ciao e grazie
Prego! ;-)

--
Matteo Migliore
http://blogs.ugidotnet.org/matteomigliore
GLuca
2009-03-17 20:03:16 UTC
Permalink
Post by Matteo Migliore
Post by GLuca
Non ho capito come posso applicarlo al mio caso. Ad esempio,
dall'interfaccia web per il censimento degli eventi inserisco "13/06/2009
10:30 Madrid Evento1". Questo record viene inserito sul mio server in italia.
Quando salvi il record, l'ora che inserisci è UTC quindi indipendente
dal fusorario, poi in un campo separato puoi salvare il GMT (+1, +2, -3
etc...)
oppure la nazione, in questo modo tutti i campi DateTime sul DB
sono riferiti a GMT 0.
Chiaro?
Post by GLuca
Come dovrei salvare la data e l'orario in modo tale che quando sul server
sono le 13/06/2009 10:30(italiane) posso confrontare la data dell'evento
tendendo conto del fuso diverso?
--------------------------------------
DateTime date = new DateTime(2009, 12, 10, 10, 20, 10);
int gmt = (date - date.ToUniversalTime()).Hours;
--------------------------------------
http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime.aspx
Post by GLuca
Ciao e grazie
Prego! ;-)
--
Matteo Migliore
http://blogs.ugidotnet.org/matteomigliore
Ciao Matteo, innanzitutto grazie per la tua infinita pasienza.
scusa ma non riesco a capire,
Post by Matteo Migliore
DateTime date = new DateTime(2009, 12, 10, 10, 20, 10);
int gmt = (date - date.ToUniversalTime()).Hours;
in gmt ottengo di quante ore in italia siamo avanti rispetto al fuso zero
giusto?
ma come faccio poi a sapere che ore sono a kabul?
devo sapere quante ore kabul è in avanti rispetto al fuso zero?
se è cosi però devo sapere anche se c'è l'ora legale?

scusa per l'ignoranza ma proprio non riesco ad arrivarci
Matteo Migliore
2009-03-17 20:35:51 UTC
Permalink
Post by GLuca
Post by Matteo Migliore
DateTime date = new DateTime(2009, 12, 10, 10, 20, 10);
int gmt = (date - date.ToUniversalTime()).Hours;
in gmt ottengo di quante ore in italia siamo avanti rispetto al fuso zero
giusto?
Sì, era a dimostrazione del fatto che ToUniversalTime tiene
restituisce l'ora UTC rispetto all'instanza creata dal
costruttore del DateTime, che prende la TimeZone della
macchina, o meglio del thread, che esegue il codice.

Leggi anche il perchè di questa scelta qui:
http://www.michaelbrumm.com/simpletimezone.html
Post by GLuca
ma come faccio poi a sapere che ore sono a kabul?
Attraverso il GMT, la città però devi prenderla in un
altro modo, ad esempio chiedendola all'utente :-).
Post by GLuca
devo sapere quante ore kabul è in avanti rispetto al fuso zero?
se è cosi però devo sapere anche se c'è l'ora legale?
Fai così:
1. quando devi salvare un DateTime sul DB
da codice C# memorizzi *sempre* il formato
UTC, quindi quando passi un DateTime ad
un DbCommand richiami ToUniversalTime
2. per ogni record memorizzi anche il GMT
a cui si riferisce il DateTime e se c'è l'ora legale,
quindi in totale i campi che servono sono:
1. DateTime (UTC)
2. byte (GMT)
3. bit (è ora legale)
----------------------------
DateTime now = DateTime.Now;
int gmt = TimeZone.CurrentTimeZone.GetUtcOffset(now).Hours;
bool isDaylightSavingTime = now.IsDaylightSavingTime();
----------------------------
Post by GLuca
scusa per l'ignoranza ma proprio non riesco ad arrivarci
E di cosa? :-)

--
Matteo Migliore
http://blogs.ugidotnet.org/matteomigliore
GLuca
2009-03-18 10:18:06 UTC
Permalink
Post by Matteo Migliore
Attraverso il GMT, la città però devi prenderla in un
altro modo, ad esempio chiedendola all'utente :-).
Post by GLuca
devo sapere quante ore kabul è in avanti rispetto al fuso zero?
se è cosi però devo sapere anche se c'è l'ora legale?
1. quando devi salvare un DateTime sul DB
da codice C# memorizzi *sempre* il formato
UTC, quindi quando passi un DateTime ad
un DbCommand richiami ToUniversalTime
2. per ogni record memorizzi anche il GMT
a cui si riferisce il DateTime e se c'è l'ora legale,
1. DateTime (UTC)
2. byte (GMT)
3. bit (è ora legale)
----------------------------
DateTime now = DateTime.Now;
int gmt = TimeZone.CurrentTimeZone.GetUtcOffset(now).Hours;
bool isDaylightSavingTime = now.IsDaylightSavingTime();
----------------------------
Post by GLuca
scusa per l'ignoranza ma proprio non riesco ad arrivarci
E di cosa? :-)
--
Matteo Migliore
http://blogs.ugidotnet.org/matteomigliore
ti chiedo scusa ancora ma non riesco a capire come applicare tutto ciò al
mio caso,
provo a spiegarmi di nuovo (e ti chiedo ancora pasienza)
c'è un applicativo su un server italiano
tramite un interfaccia web un utente(dall'italia) inserisce 10/06/2009 10:80
Kabul(che sceglie da una lista) "Riunione"

sul server italiano, guardando i miei record, quando trovo il record di
kabul, come faccio a sapere (in modo generalizzato) quando quell'evento
inizia?
Prendendo spunto dalle tue righe di codice mi servirebbe questo:

TimeZoneInfo.ConvertTime(DateTime dateTime,TimeZoneInfo
sourceTimeZone,TimeZoneInfo destinationTimeZone) i primi due parametri li ho,
ma come posso fare a recuperare il destinationTimeZone di kabul o sideny e
via dicendo?


ciao e grazie di tutto
Matteo Migliore
2009-03-18 10:51:29 UTC
Permalink
Post by GLuca
TimeZoneInfo.ConvertTime(DateTime dateTime,TimeZoneInfo
sourceTimeZone,TimeZoneInfo destinationTimeZone) i primi due parametri li ho,
ma come posso fare a recuperare il destinationTimeZone di kabul o sideny e
via dicendo?
Facciamo un esempio, quando ci si iscrive ad un portale, l'utente
sceglie anche il suo TimeZone, perchè è l'unico modo per ottenerlo,
altrimenti dovresti fargli inserire città e stato e ottenere il TimeZone da
quella informazione, cosa che con .NET non è possibile, probabilmente
si trova qualche DB contentente questi dati.

In sostanza il GMT lo specifica l'utente o alla registrazione
o all'inserimento del record, oltre alla data e ora.
Post by GLuca
ciao e grazie di tutto
Prego! ;-)

--
Matteo Migliore
http://blogs.ugidotnet.org/matteomigliore
GLuca
2009-03-18 15:28:01 UTC
Permalink
Post by Matteo Migliore
Post by GLuca
TimeZoneInfo.ConvertTime(DateTime dateTime,TimeZoneInfo
sourceTimeZone,TimeZoneInfo destinationTimeZone) i primi due parametri li ho,
ma come posso fare a recuperare il destinationTimeZone di kabul o sideny e
via dicendo?
Facciamo un esempio, quando ci si iscrive ad un portale, l'utente
sceglie anche il suo TimeZone, perchè è l'unico modo per ottenerlo,
altrimenti dovresti fargli inserire città e stato e ottenere il TimeZone da
quella informazione, cosa che con .NET non è possibile, probabilmente
si trova qualche DB contentente questi dati.
In sostanza il GMT lo specifica l'utente o alla registrazione
o all'inserimento del record, oltre alla data e ora.
Post by GLuca
ciao e grazie di tutto
Prego! ;-)
--
Matteo Migliore
http://blogs.ugidotnet.org/matteomigliore
è tutto chiaro, grazie mille per tutto il tuo tempo

Continua a leggere su narkive:
Loading...