2016-04-08 16 views
0

I Speichern von Daten in MySql Datetime-Feld, und ich sparte immer UTC-Datum von C# (mit someDate.ToUniversalTime()).UTC datetime Umwandlung in Ortszeit

Ich bin in der mitteleuropäischen Zeitzone.

Ich habe ein Datum, das am 08.03.2016 als 2016-04-07 16:00:00 gespeichert wurde (Ereignis wurde in der Zukunft zu dieser Zeit festgelegt) und korrekte Ortszeit für dieses Ereignis war 2016-04-07 17:00:00, so wurde es zu dieser Zeit als GMT + 1 gespeichert. Ich habe someDate.ToLocalTime() verwendet, um die korrekte Ortszeit zu erhalten, und es hat gut funktioniert. wegen DayLight Ereignisses

Heute (im April), die am Ende des März aufgetreten wir haben GMT + 2 versetzt und jetzt someDate.ToLocalTime() zeigt mir noch 1 Stunde: 2016.04.07 18.00 Uhr : 00 was nicht stimmt.

Wie löst man das universell? Ich möchte die UTC-Zeit (wie jetzt) ​​speichern und dann eine Systemkonvertierung anwenden, die die aktuelle Zeitzone des Benutzers verwendet und immer die korrekte Ortszeit von meinem gespeicherten UTC-Datum in Bezug auf den aktuellen DayLightSaving-Status zurückgibt. Es sollte auch zurückgeben 2016-04-07 17:00:00 und nicht 2016-04-07 18:00:00

+0

Verwenden 'TIMESTAMP' statt' DATETIME' und dann den 'time_zone' Session-Variable-MySQL wird den Rest erledigen. – eggyal

+0

Ist dies eine Desktop-App oder eine Web-App? Im Allgemeinen sollten nur Desktop-Anwendungen "ToLocalTime" und "ToUniversalTime" verwenden. –

Antwort

1

Ihre Annahme ist falsch: Die gültige Ortszeit für 2016-04-07 16:00 UTC in Central Europe Timezone ist immer 2016-04-07 18:00 und war nie 2016-04-07 17:00. Sie müssen den UTC-Offset immer in Bezug auf das Datum, das Sie sich ansehen, und nicht das aktuelle Datum berechnen.

Versuchen Sie den folgenden Code. Es wird immer die gleichen Werte gedruckt werden, unabhängig von Ihrem aktuellen Datum (das heißt, ob Sie sich gerade in daylightsaving ist oder nicht)

var dt1 = new DateTime(2016, 3, 1, 15, 0, 0, DateTimeKind.Utc); 
var dt2 = new DateTime(2016, 5, 1, 15, 0, 0, DateTimeKind.Utc); 

var s1 = dt1.ToLocalTime().ToString("s"); 
var s2 = dt2.ToLocalTime().ToString("s"); 

Console.WriteLine(s1); //prints 2016-03-01T16:00:00 because GMT+1 at that date 
Console.WriteLine(s2); //prints 2016-05-01T17:00:00 because GMT+2 at that date 
Verwandte Themen