2009-10-12 4 views
10

Ich muss einige Daten und Zeiten aus einer alten Datenbank verwenden. Sie werden als Strings dargestellt. Daten sind TT/MM/JJ. Zeiten sind HH: mm.Konvertieren UK-Zeiten (sowohl BST und GMT) als Zeichenfolgen in UTC (in C#)

Ich möchte diese in UTC konvertieren, sobald ich sie aus der Datenbank ziehen. Ich arbeite an US-Systemen, brauche also eine gemeinsame Zeit.

Das Problem, mit dem ich konfrontiert bin, ist, wie man sie in UTC DateTime Werte umwandelt. Ich kann Parsing usw. machen. Das eigentliche Problem, das ich habe, betrifft die Zeitzone.

Ich versuche, den folgenden Ansatz zu verwenden:

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

Doch diese gibt falsche Werte, wenn das Datum in der britischen Sommerzeit ist.

Ich kann "GMT Daylight Time" an diesen Daten verwenden, aber das erfordert, dass ich weiß, wann die Umschaltung ist. Ich bin mir sicher, dass es einen weniger mühsamen Weg geben muss.

Da ich keine Maschine mit britischen Zeiteinstellungen verwende, kann ich mich nicht auf lokale Zeit verlassen.

Grundsätzlich brauche ich so etwas wie:

// 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) 
{ 
    ... 
} 

Ich habe die Beiträge durchforstet, konnte aber nichts finden, dass diese direkt angesprochen. Sicher ist dies auch ein Problem mit EST, EDT, etc?

+0

Ich brauche dies als generische TimeInTimeZone-> TimeInUTC-Methode. –

Antwort

5

Verwenden Sie die GetUtcOffset()-Methode auf Ihrer TimeZoneInfo-Instanz, die "Anpassungsregeln" berücksichtigt.

Verwenden Sie dies sollte im Grunde das gleiche wie Ihr ursprüngliches Beispiel, aber Sie werden diese Methode anstelle der BaseUtcOffset Eigenschaft verwenden.

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

Schön, aber könnten Sie vielleicht ein Codebeispiel für die Ignoranten posten? Dies sollte eine kanonische Ressource sein. –

+0

Ich denke, dieses Beispiel sollte abdecken, was Sie tun müssen. Lass es mich wissen, wenn du das alles vereinfacht hast. – bdukes

+0

Einzige Sache, die ich hinzufügen würde, ist, dass, um ein tatsächliches DateTime-Objekt zu erhalten, ich auf 'utcTime.UtcDateTime' verwiesen habe –

0

Wie sei:

DateTime.Parse(dateTimeString).ToUniversalTime(); 

Unter der Annahme, dass der Datenbankserver seine Datetimes in der gleichen Zeitzone wie der Anwendungsserver gespeichert ist.