2009-06-08 16 views
10

Ho bisogno di avere una funzione comune per convertire l'ora UTC in EDT. Ho un server in India. Un'applicazione in esso deve utilizzare il tempo EDT per tutti gli scopi temporali.Come convertire il tempo tra fusi orari (da UTC a EDT)?

Sto usando .NET 3.5.

Ho trovato questo su qualche altro forum.

DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
     DateTime.UtcNow, "Eastern Standard Time"); 

Quando ho provato con "Easten Daylight Time" ho ricevuto un errore.

"L'ID del fuso orario 'Ora legale orientale' non è stato trovato sul computer locale".

Si prega di aiuto con questa o qualsiasi altra soluzione.

risposta

22

Eastern Daylight Time non è il nome di un fuso orario "completo": è "metà" di un fuso orario, in effetti, sempre 4 ore indietro rispetto all'ora UTC. (Potrebbe esserci una terminologia corretta per questo, ma non ne sono a conoscenza.)

Perché si desidera utilizzare EDT per le ore in cui non è stata applicata l'ora legale? Se si desidera un fuso orario personalizzato con lo stesso offset su UTC, utilizzare TimeZoneInfo.CreateCustomTimeZone.

Si noti che se si utilizza il fuso orario Eastern Standard (TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")), l'ora legale verrà applicata in modo appropriato (vale a dire durante l'estate).

Ad esempio:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 

// Prints True 
Console.WriteLine(tzi.IsDaylightSavingTime(new DateTime(2009, 6, 1))); 
// Prints False 
Console.WriteLine(tzi.IsDaylightSavingTime(new DateTime(2009, 1, 1))); 
+0

Ciao Jon, grazie per la tua risposta. Cosa suggeriresti come soluzione migliore per questi 2? devo creare un fuso orario personalizzato o utilizzare TimeZoneInfo.FindSystemTimeZoneById ("Eastern Standard Time"); considerando che si prenderà cura dell'ora legale. E come mi prendo cura di questo problema nelle procedure memorizzate che utilizzano il metodo getdate() e prendono l'ora IST? – Shetty

+0

Non conosco le stored procedure, per essere onesti - se possibile, passare UTC in loro e fargli capire UTC. Per quanto riguarda l'eventuale utilizzo di un fuso orario personalizzato di Eastern Standard Time, dipende dal fatto se si desidera un fuso orario che è * sempre * 4 ore indietro rispetto all'ora UTC o uno che corrisponde all'ora standard orientale. All'inizio hai dichiarato che dovevi utilizzare EDT "per tutti gli scopi" - ti suggerisco di controllare se * davvero * hai bisogno di EDT, o se hai bisogno di Eastern Standard Time. –

+0

Ok Jon. Mi è stato chiesto di utilizzare l'ora della città * di Boston * come ora standard per tutti gli scopi temporali, che rientra in EDT. Non ero molto consapevole del risparmio di luce diurna. Volevo che la mia applicazione prendesse questa volta anche se è in esecuzione nel server IST. In precedenza era in un altro server che era in esecuzione nel fuso orario EDT e non ho avuto tali problemi. – Shetty

1

avrei detto che si dovrebbe usare UTC per i calcoli di periodi di tempo, in modo da evitare problemi di ora legale e quindi utilizzare LocalTime solo per la visualizzazione.

DateTime.ToLocalTime per UTC a qualunque sia il fuso orario locale e quindi DateTime.ToUniversalTime per la conversione da ora locale a UTC.

Edit dopo il commento 1

faccio a prenderlo allora che siete dopo la visualizzazione di un fuso orario diverso da quello del server?

Se si stanno utilizzando pagine Web per accedere al server, utilizzare HttpRequest.UserLanguages ​​per creare un oggetto CultureInfo e utilizzarlo per analizzare l'oggetto DateTime. Cerca qui una spiegazione completa: Microsoft link on displaying local user time for web pages.

Se si utilizza l'architettura client-server, se la chiamata LocalTime si trova sul lato client, verrà visualizzato LocalTime per il client. Quindi lo converti in UTC per inviarlo al tuo server.

In entrambi i casi il server non ha bisogno di sapere dove si trova il client, quindi se ci sono più client in più fusi orari, tutti i calcoli corrisponderanno. Ti permetterà anche di mostrare gli orari in qualsiasi fuso orario che desideri usando diversi oggetti Cultura.

Edit 2 copiato il mio secondo commento

È possibile ottenere dati in tempo in formato UTC dal server. Quindi puoi convertirlo usando DateTime.ToLocalTime o DateTime.ToUniversalTime come richiesto. Se si includono anche le date e si ha bisogno di gestire i formati MM/gg/aaaa europei e gg/MM/aaaa statunitensi, è possibile utilizzare la classe CultureInfo per analizzare di conseguenza il valore DateTime. Sembra più lavoro di quello che si ha in questo momento, ma significherebbe che se si sposta nuovamente il server, non è necessario ricodificare la gestione di DateTime.

Un nuovo punto

Un altro punto da guardare è la sincronizzazione dell'orologio tra il server ei client che utilizzano NTP (Network Time Protocol) o SNTP (Simple Network Time Protocol) se è abbastanza preciso. Non so quale sistema operativo si sta utilizzando, ma questo è utilizzato dai servizi orari di Windows Server per sincronizzare le reti.

+0

Ciao Chris, Grazie per la risposta. Se non sbaglio, se il server è in esecuzione nel fuso orario di IST, Datetime.ToLoalTime da UTC darà il tempo in IST.stato? – Shetty

+0

Vero. Ho modificato la mia risposta. Per spiegare come LocalTime scrive il codice Client-server e anche i puntatori a visualizzare l'ora locale per gli utenti web. – ChrisBD

+0

Ciao Chris, hai capito bene. Sto visualizzando un fuso orario diverso da quello del server. Si tratta di un'architettura client server. Ma non voglio fare affidamento sul tempo del sistema client, perché tutti i tempi della macchina client potrebbero non essere esattamente gli stessi. dove come se utilizza la temporizzazione del server, sarebbe uniforme per tutti i client. – Shetty

0

Il metodo cowboy consiste nel prendere l'ora UTC, sottrarre quattro ore di secondi da esso (l'offset del fuso orario), formattarlo utilizzando una funzione di formattazione UTC e applicare un'etichetta "EDT" su di esso.

Se è necessario utilizzare l'ora legale a volte e l'ora standard altre volte, effettuare una tabella di ricerca delle date di passaggio o utilizzare una funzione di calendario.

Problemi correlati