2013-03-02 11 views
14

Ho bisogno di aiuto per convertire un DateTime in un fuso orario specifico. Quello che ho di sotto non funziona correttamente.Come convertire un datetime in un determinato fuso orario in C#?

gmTime = 03/02/2013 1:00:00 AM

TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
var time = timeZoneInfo.ConvertTime(gmTime, timeZone); 

Quando il debug il valore di time, che dovrebbe essere 03/01/2013 8:00:00 PM quando viene applicata la zona, ritorna come 03/02/2013 1:00:00 AM.

Se faccio time.ToLocalTime() quindi ottengo il valore corretto. Tuttavia, ho bisogno di convertire time in diversi fusi orari.

+0

Hai mai pensato di utilizzare Noda time? https://code.google.com/p/noda-time/ –

+0

Stavo per suggerire noda-time, ho anche usato http://www.babiej.demon.nl/Tz4Net/main.htm con successo – JeremyWeir

+0

@RayCheng darò un colpo. Grazie. –

risposta

5

Provare qualcosa di simile al seguente Chace

TimeZoneInfo estTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
DateTime estDateTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, estTimeZone); 
13

oggetti DateTime hanno una variabile "genere" che aiuta TimeZoneInfo sa come trattarla. Nel MSDN documentation per TimeZone.ConvertTime ha la seguente:

DateTimeKind.Local, Converte l'ora locale al tempo in destinationTimeZone.

DateTimeKind.Utc, converte l'ora universale coordinata (UTC) nell'ora in destinationTimeZone.

DateTimeKind.Unspecified, presumibilmente locale.

Ad esempio:

Console.WriteLine("Local time zone is '{0}'.", TimeZoneInfo.Local.Id); 

    var gmTime   = new DateTime(2013, 03, 02, 01, 00, 00, DateTimeKind.Utc); 
    var localTime  = new DateTime(2013, 03, 02, 01, 00, 00, DateTimeKind.Local); 
    var unspecifiedTime = new DateTime(2013, 03, 02, 01, 00, 00); 

    var timeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 

    var gmTimeConverted   = TimeZoneInfo.ConvertTime(gmTime,   timeZone); // 03/02/2013 8:00:00AM 
    var localTimeConverted  = TimeZoneInfo.ConvertTime(localTime,  timeZone); // 03/02/2013 
    var unspecifiedTimeConverted = TimeZoneInfo.ConvertTime(unspecifiedTime, timeZone); 

    Console.WriteLine("Converting GMT   to EST: {0}", gmTimeConverted); 
    Console.WriteLine("Converting Local  to EST: {0}", localTimeConverted); 
    Console.WriteLine("Converting Unspecified to EST: {0}", unspecifiedTimeConverted); 

risultati in:

 
Local time zone is 'Pacific Standard Time'. 
Converting GMT   to EST: 3/1/2013 8:00:00 PM 
Converting Local  to EST: 3/2/2013 4:00:00 AM 
Converting Unspecified to EST: 3/2/2013 4:00:00 AM 

o se il fuso orario locale è 'Orientale standard Time' si ottiene questi risultati

 
Local time zone is 'Eastern Standard Time'. 
Converting GMT   to EST: 3/1/2013 8:00:00 PM 
Converting Local  to EST: 3/2/2013 1:00:00 AM 
Converting Unspecified to EST: 3/2/2013 1:00:00 AM 



Se desideri che TimeZoneInfo consideri "Non specificato" come Utc, dovresti funzionare come TimeZoneInfo.ConvertTimeFromUtc. Ancora da MSDN documentation

DateTimeKind.Local, Genera un ArgumentException.

DateTimeKind.Unspecified o DateTimeKind.Utc, Converte da Coordinated Universal Time (UTC).

Problemi correlati