2013-05-20 17 views
5

Sono contro un problema memorizzazione datetimes come UTC e confuso perché questo non produce lo stesso risultato quando si cambia fuso orario:Conversione ora locale in UTC

var dt = DateTime.Parse("1/1/2013"); 
MessageBox.Show(TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local).ToString()); 

sto passare manualmente il fuso orario locale sul macchina tra orientale e centrale.

Rendimenti centrali 1/1/2013 6:00:00 AM e Rendimenti orientali 1/1/2013 5:00:00 AM. Cosa mi manca qui? Dovrebbero essere gli stessi indipendentemente dal fuso orario, corretto?

Grazie mille in anticipo!

+4

Così si sta prendendo tempo stesso di partenza, associandolo ad un fuso orario, i convertirlo in UTC, e ottenere diversi tempi UTC? Sembra che funzioni. – cadrell0

+0

Penso che sia necessario leggere questo post sul blog di Jon Skeet per comprendere pienamente i problemi con i dati UTC/datet locali: http://noda-time.blogspot.co.uk/2011/08/what-wrong-with-datetime-anyway .html –

+0

Non capisco perché si desidera convertire in UTC. Che ne dici di iniziare semplicemente in UTC? C'è un sovraccarico di 'DateTime.Parse' che ti permette di specificare' Kind'. – CodesInChaos

risposta

8

Penso che quello che vi manca è che il DateTime restituito dal tuo DateTime.Parse() dichiarazione non arriva con un fuso orario. È solo una data e un'ora che possono essere in qualsiasi fuso orario. Quando chiami il numero TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local), stai indicando il fuso orario in cui inizia. Quindi, se inizi in Central, otterrai una risposta, mentre se inizi in Eastern, riceverai una risposta un'ora prima, UTC. In effetti, questo è ciò che mostra il tuo codice.

+0

Quindi se eseguo DateTime.Now.ToUniversalTime() su Central è come se fossi su Eastern. Come creo un oggetto datetime che quando converto in universale, è lo stesso indipendentemente dal fuso orario ??? –

+0

@ user1174729 - quando dici "ora" stai parlando di un istante nel tempo. Se hai detto "ora" a mezzanotte nel tuo fuso orario, non sarebbe mezzanotte l'altro. Se si desidera costruire un datetime uguale indipendentemente dal fuso orario, è necessario crearlo in UTC. C'è un costruttore che puoi passare a 'DateTimeKind.Utc'. –

+0

Sì, quello che ha detto Matt. Il trucco è lavorare sempre con DateTimes che sono in UTC e quindi convertirli nel fuso orario dell'utente durante la visualizzazione. –

3

C'è un metodo per .ToUtc()DateTime classe

+0

Stesso risultato per: MessageBox.Show (dt.ToUniversalTime(). ToString()); –

+0

È giusto. Btw, la stessa ora per CST e EST sarà effettivamente diversa di un'ora nell'UTC –

1

Questa è la mezzanotte

var dt = DateTime.Parse("1/1/2013"); 

Midnight in orientale e centrale non è lo stesso tempo assoluto.
Questo è lo scopo dei fusi orari.

+0

Sì, questa è la risposta giusta. La mezzanotte in un fuso orario è 5UTC e mezzanotte nell'altro fuso orario è 6UTC. –

0

È possibile utilizzare NodaTime:

static string LocalTimeToUTC(string timeZone, string localDateTime) 
{ 
    var pattern = LocalDateTimePattern.CreateWithInvariantCulture("dd/MM/yyyy HH:mm:ss"); 
    LocalDateTime ldt = pattern.Parse(localDateTime).Value; 
    ZonedDateTime zdt = ldt.InZoneLeniently(DateTimeZoneProviders.Tzdb[timeZone]); 
    Instant instant = zdt.ToInstant(); 
    ZonedDateTime utc = instant.InUtc(); 
    string output = utc.ToString("dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture); 

    return output; 
} 
Problemi correlati