Newsgroup: it.comp.lang.visual-basic
Titolo: Buongiorno a tutti, mi presento...

Un saluto caloroso a tutto il newsgroup.
Sono un ex-programmatore, ma ormai mi occupo da moltop tempo di TLC e non 
programmo più da anni. Mi trovo tuttavia a rimettere mano al VB per una 
applicazione personale, e sto incontrando una grande difficoltà per svolgere 
una (credo) semplice operazione.
Magari per VOI è semplice... ma io mi ci sto impazzendo!  :-(
In sostanza: ho in INPUT una certa data/ora, espressa in GMT (Greenwich 
Median Time).
Ho bisogno di convertirla in data/ora LOCALE, supponiamo ad esempio in 
Italia.
Il tutto senza trascurare l'eventuale presenza dell'ora LEGALE in quella 
data/ora.
Insomma... un bel grattacapo, ci sto lavorando da giorni!! :-(
La funzione che più si avvicina alla mia esigenza è la seguente:
Private Declare Function GetTimeZoneInformation Lib "kernel32" _
    (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long
Ma non riesco ad ottenere ciò che voglio... la funzione i ritorna molte 
informazioni, alcune molto per me utili, ed altre che non mi servono.
La funzione mi restituisce correttamente tutti i parametri (tra i quali mi 
occorre solamente lo shift rispetto a Greenwich), ma purtroppo questo shift 
(espresso in minuti) è riferito alla data/ora di sistema, quindi mi ritorna 
delle informazioni corrette ma che sono valide soltanto per ADESSO, e non 
per una data X che stabilisco io...
Non trovo il modo di passargli l'istruzione: "la data non è quella di 
sistema, ma è quest'altra..."
Una volta trovato questo, sono a posto, perché la risposta di 
GetTimeZoneInformation è più che ottima per la mia esigenza. L'unico 
problema per me, è che si riferisce all'ora e data attuale del sistema e 
(sembra) non è possibile utilizzarla diversamente!!!
Non ditemi di cambiare data/ora al sistema, chiamare la funzione, e 
ripristinare, perché è una porcata schifosissima, e cose del genere io non 
ne faccio! :-)
Oltretutto andrebbe in errore il mio programma, se eseguito da un utente non 
amministratore, che in quanto tale non si sarebbe autorizzato a cambiare la 
data di sistema.
Insomma... la cosa è rognosa, lo so... :-(
Spero che qualche anima buona, qualcuno tra voi che ha lavorato con gli 
orari GMT/locali, sappia darmi la dritta illuminante!
Grazie a tutti per avermi letto sin qui...
B.


la cosa e' fattibile ma non riesco a rispondere a una equazione!!!
c'e' il rischio che il risultato sia un numero immaginario
:)))

 :)))
ROTFL! Non mi toccare la trasformata di Lorents, che ci sono 
affezionatissimo!!!
A parte gli scherzi... hai davvero la soluzione? 

 per una data X che stabilisco io...
Ipotizzando che non ti serva solo in Italia, quello che ti serve,
è una tabella con le regole per l'ora legale nei vari stati.
Siccome sono regole variabili, sicuramente alla MS ne hanno una
lista aggiornata, ma non ho idea... aspè... ah ecco :-)
http://vbnet.mvps.org/index.html?code/locale/timezonebiaslookup.htm
e anche, ovviamente
http://vbnet.mvps.org/index.html?code/locale/gettimezoneinfo.htm
Guarda nei vari link "related", c'è sicuramente qualcosa che ti interessa.
Bye, G.

 Insomma... un bel grattacapo, ci sto lavorando da giorni!! :-(
Tempo fa feci un progettino di prova che date 2 data/ora in qualunque time zone
restituiva la differenza oraria assoluta, tenendo conto di tutto.
Non è difficile adattarlo per i tuoi scopi, se vuoi te lo posso mandare in
privato.
Bye
Raf

 lista aggiornata....
Anche qui hai ragione, ma seguimi... non ho nessun bisogno di avere la lista 
aggiornata, perché la lista c'è già, ed è sempre aggiornatissima, sta nel 
sistema operativo!
Con la funzione GetTimeZoneInformation (che si trova nella libreria kernel32 
di tutti i sistemi operativi MS recenti) ottengo il bias completo di tutto!
Infatti il sistema operativo SA BENISSIMO tutte le regole di tutte le 
nazioni catalogate nei fusi orari, con tanto di regola dell'eventuale ora 
legale/solare.
Tanto è vero, che quando imposti la data e la nazionalità al tuo sistema, in 
fase di installazione, dopo fa tutti lui.... :-)
La funzione di cui sopra quindi, accede alla tabella del GMT ed alla tabella 
dell'ora legale, ma per me è del tutto trasparente... mi ritorna esattamente 
il bios giusto! Il problema è che lo fa soltanto per la data/ora corrente, 
non per una data/ora passata... che è invece quello che serve a me.
Ci sono anche altre funzioni, nel kernel, per tirare fuori l'elenco di tutti 
i giorni di passaggio legale/solare di una determinata zona, combinando i 
risultati e facendo una successiva elaborazione otterrei comunque il mio 
scopo, ma volevo evitare di fare tutto questo... speravo che la chiamata 
alla GetTimeZoneInformation fosse impostabile anche con una data arbitraria, 
e continuo a sperarlo... ancora per qualche giorno... dopodiché risolvo 
diversamente.
Grazie tantissimo, comunque, per il tuo aiuto, e questo vale anche per gli 
altri che mi hanno risposto.
Per concludere, se qualcuno conosce bene come si usa la 
GetTimeZoneInformation, o comecavolosifà a dargli una data diversa, si 
faccia avanti...  :-))  avrà tutta la mia gratitudine!
B.

 faccia avanti...  :-))  avrà tutta la mia gratitudine!
Devi usare altre API: TzSpecificLocalTimeToSystemTime per trasformare un orario
locale ad una certa timezone in quello universale e
SystemTimeToTzSpecificLocalTime per fare l'operazione inversa con la nuova
timezone.
Bye
Raf

 timezone.
Grazie Rafunk!!!
Però purtroppo la prima API è presente solo in XP e Vista...  la seconda API 
è più "antica", c'era già in Win2000 ed NT, ma entrambe non sono nei sistemi 
operativi più datati!
A me funzioneranno di sicuro... ma quando distribuisco l'applicazione e me 
la fanno girare su un Windows98, mi sa che si schianta di brutto! :-(
La GetTimeZomeInformation, invece, è una funzione antichissima... è nel 
kernel sin dai tempi di Windows95...
Che tocca fare, eh, per essere compatibili!! :-(( 


cosi' ti puo' bastare?
<code>
Private Type TIME_ZONE_INFORMATION
   bias As Long
   StandardName(1 To 64) As Byte
   StandardDate As SYSTEMTIME
   StandardBias As Long
   DaylightName(1 To 64) As Byte
   DaylightDate As SYSTEMTIME
   DaylightBias As Long
End Type
Dim tzi As TIME_ZONE_INFORMATION
Dim la_tua_data As Date
Dim ret As Long
ret = GetTimeZoneInformation(tzi)
' ret= TIME_ZONE_ID_DAYLIGHT : ora legale
' ret= TIME_ZONE_ID_STANDARD : ora solare
If ret = TIME_ZONE_ID_DAYLIGHT Then
   dtGMT = DateAdd("n", tzi.bias + tzi.DaylightBias, la_tua_data)
Else
   dtGMT = DateAdd("n", tzi.bias, la_tua_data)
End If
</code>
in dtGMT ti ricavi data/ora di Greenwich (solare)
in base alla tua data che puo' essere fornita o in periodo
di ora legale (cioe' TIME_ZONE_ID_DAYLIGHT)
o in periodo di ora solare.
per il processo inverso suppongo diventi:
If ret = TIME_ZONE_ID_DAYLIGHT Then
   la_tua_data = DateAdd("n", -(tzi.bias + tzi.DaylightBias), dtGMT)
Else
   la_tua_data = DateAdd("n", tzi.bias, dtGMT)
End If

 
pardon! mancava un segno meno

 ha scritto nel messaggio
news:du4o30$3a9$1...@newsreader.mailgate.org...

Già già... allora penso che Salclem ti abbia già fornito una soluzione
alternativa valida anche per i sistemi più vecchi.
Bye
Raf

 wrote in message 
news:4406a3ea$1...@news.unimib.it...


 alternativa valida anche per i sistemi più vecchi.
Infatti... mi ha dato proprio la dritta che mi serviva.
Purtroppo i problemi di compatibilità (se non vengono pensati prima, in fase 
di progettazione) poi saltano fuori come funghi... :-))
Ciao!
B.