2009-10-12 3 views
10

Devo utilizzare alcune date e orari da un database precedente. Sono rappresentati come stringhe. Le date sono gg/MM/aa. I tempi sono HH: mm.Conversione delle ore del Regno Unito (sia BST che GMT) rappresentate come stringhe in UTC (in C#)

Mi piacerebbe convertirli in UTC non appena li estraggo dal database. Sto lavorando su sistemi statunitensi, quindi ho bisogno di un tempo comune.

Il problema che sto affrontando è come convertirli in valori DateTime UTC. Posso fare l'analisi, ecc. Il vero problema che ho riguarda il fuso orario.

che sto cercando di utilizzare il seguente approccio:

DateTime ukTime = // Parse the strings in a DateTime value. 
TimeZoneInfo timeZoneInformation = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 
DateTimeOffset utcTime = new DateTimeOffset(ukTime, timeZoneInformation.BaseUtcOffset); 

Tuttavia, questo dà valori errati se la data è nel periodo di ora legale.

Posso usare "GMT Daylight Time" in quelle date, ma ciò richiede che io sappia quando è il passaggio. Sono sicuro che ci deve essere un modo meno laborioso.

Dato che non sto utilizzando una macchina con le impostazioni dell'ora del Regno Unito, non posso fare affidamento sull'ora locale.

Fondamentalmente, ho bisogno di qualcosa come:

// Works for both GMT (UTC+0) and BST (UTC+1) regardless of the regional settings of the system it runs on. 
DateTime ParseUkTimeAsUtcTime(string date, string time) 
{ 
    ... 
} 

Ho perlustrato i posti, ma non ho trovato nulla che ha affrontato direttamente. Sicuramente anche questo è un problema con EST, EDT, ecc.?

+0

Ho bisogno di questo come un metodo TimeInTimeZone-> TimeInUTC generico. –

risposta

5

Provare a utilizzare il metodo GetUtcOffset() nell'istanza TimeZoneInfo, che tiene conto delle "regole di regolazione".

L'utilizzo di questo dovrebbe funzionare fondamentalmente come nell'esempio originale, ma verrà utilizzato tale metodo anziché la proprietà BaseUtcOffset.

DateTime ukTime = // Parse the strings in a DateTime value. 
TimeZoneInfo timeZoneInformation = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 
DateTimeOffset utcTime = new DateTimeOffset(ukTime, timeZoneInformation.GetUtcOffset(ukTime)); 
+0

Bello, ma potresti forse postare un esempio di codice per l'ignorante? Questa dovrebbe essere una risorsa canonica. –

+0

Penso che questo esempio dovrebbe coprire ciò che devi fare. Fammi sapere se hai semplificato questo. – bdukes

+0

L'unica cosa che vorrei aggiungere a questo, è che per ottenere un oggetto DateTime effettivo ho fatto riferimento a "utcTime.UtcDateTime' –

0

ne dite:

DateTime.Parse(dateTimeString).ToUniversalTime(); 

Supponendo che il server di database memorizza i propri datetimes nello stesso fuso orario come server applicazioni.

Problemi correlati