2009-01-13 5 views
38

Unabhängig davon, was die lokale Zeitzone des Benutzers festgelegt ist, mit C# (.NET 2.0) muss ich die Uhrzeit (DateTime-Objekt) in der Eastern-Zeitzone bestimmen.Get DateTime für eine andere Zeitzone unabhängig von der lokalen Zeitzone

Ich weiß, über diese Methoden aber es scheint nicht zu offensichtlich, dass die Art und Weise, um einen Datetime-Objekt für eine andere Zeitzone zu bekommen als das, was sich der Benutzer befindet.

DateTime.Now 
DateTime.UtcNow 
TimeZone.CurrentTimeZone 

Natürlich die Lösung Bedürfnisse Sommerzeit bewusst sein.

+0

Bitte sehen http://stackoverflow.com/questions/27415652/get-eastern-time-in-c-sharp-without-converting-local-time – Jay

Antwort

8

Wie alle anderen erwähnten, enthält .NET 2 keine Zeitzoneninformationen. Die Informationen werden in der Registry gespeichert, aber, und seine ziemlich trivial eine Wrapper-Klasse um es zu schreiben:

SOFTWARE \ Microsoft \ Windows NT \ Currentversion \ Time Zones

enthält Unterschlüssel für alle Zeitzonen . Der TZI-Feldwert enthält alle Übergangs- und Bias-Eigenschaften für eine Zeitzone, aber er ist vollständig in einem binären Array gefüllt.Die wichtigsten Bits (Vorspannungs- und Tageslicht), sind an den Positionen gespeichert int32s 0 und 8:

int bias = BitConverter.ToInt32((byte[])tzKey.GetValue("TZI"), 0); 
int daylightBias = BitConverter.ToInt32((byte[])tzKey.GetValue("TZI"), 8); 

Diese Seite hat eine angemessene Zusammenfassung: http://burks.brighton.ac.uk/burks/language/pascal/uddf/pages/registry.htm

+0

Link ist unterbrochen ... –

+0

Link zu Archive.org: https://web.archive.org/web/20090807133141/http: //burks.brighton.ac.uk/burks/language/pascal/uddf/pages/registry.htm – orev

1

Wie wäre es

DateTime lclTime = DateTime.Now; 
DateTime ept = lclTime.ToUniversalTime().AddHours(
        IsEasternDaylightSavingTime(
         lclTime.ToUniversalTime())? -5: -4) 

oder wenn Sie bereits lokale UTC, nur

DateTime lclUtc = DateTime.UtcNow; 
DateTime ept = lclUtc.AddHours(
        IsEasternDaylightSavingTime(lclUtc)? -5: -4) 

Verwendung statisches Wörterbuch harter codierten Werte für Feder vorwärts und Termine für die nächste für Eastern Time fallen zurück 50 Jahre .. Das ist nur 300 Bytes oder so ... und dann indizieren, um festzustellen, ob es Sommerzeit an der Ostküste ist ... Wie bereits erwähnt, Sie nicht kümmern, ob es dST in der lokalen Zone oder nicht ist ..

private static bool IsEasternDaylightSavingTime(DateTime utcDateTime) 
    { 
     // hard coded method to determine 
     // whether utc datetime is Eastern Standard time 
     // or Eastern Daylight Time 
    } 
+0

Was Wenn Ihr Standort keine Sommerzeit verwendet? Dann wird IsDaylightSavingTime false zurückgeben. –

+0

UTC wird von DST nicht beeinflusst; sicherlich ist es die Östliche DST, die wir kennen müssen, nicht Einheimische. –

+0

Bekam ... Ich weiß nicht, ob Sie ein Zeitzonenobjekt für eine andere Zeitzone erstellen können, auf die der Computer eingestellt ist. Und du hättest ein Zeitzonenobjekt für Eastern Time erstellen müssen, um zu bestimmen, ob es DST ist oder nicht ... –

78

In .NET 3.5 gibt es TimeZoneInfo, die eine Menge Funktionalität in diesem Bereich bietet; 2.0SP1 hat DateTimeOffset, aber das ist viel begrenzter.

Das Abrufen UtcNow und das Hinzufügen eines festen Offsets ist Teil des Jobs, ist aber nicht DST-fähig.

So in 3.5 ich glaube, Sie so etwas wie zu tun:

DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
    DateTime.UtcNow, "Eastern Standard Time"); 

Aber dies einfach nicht existiert in 2,0; Es tut uns leid.

+3

Obwohl er nicht innerhalb der Beschränkungen des OP war, beantwortete er meine Frage, also habe ich das geändert :) – Chris

+3

Danke ! Ich möchte nur hinzufügen: 'ReadOnlyCollection tz = TimeZoneInfo.GetSystemTimeZones(); DateTime Eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId (DateTime.UtcNow, tz [0] .Id); ' –

6

Von - http://msdn.microsoft.com/en-us/library/system.timezoneinfo.converttimefromutc.aspx

Diese Zeitzone ermöglicht nach Namen gefunden werden, falls die US schweben immer 15 Grad westlich oder östlich vom Meridian London.

DateTime timeUtc = DateTime.UtcNow; 
try 
{ 
    TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); 
    DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone); 
    Console.WriteLine("The date and time are {0} {1}.", 
        cstTime, 
        cstZone.IsDaylightSavingTime(cstTime) ? 
          cstZone.DaylightName : cstZone.StandardName); 
} 
catch (TimeZoneNotFoundException) 
{ 
    Console.WriteLine("The registry does not define the Central Standard Time zone."); 
}       
catch (InvalidTimeZoneException) 
{ 
    Console.WriteLine("Registry data on the Central STandard Time zone has been corrupted."); 
} 
2

Ich werde Sie die Zeit sparen und Ihnen sagen, dass es keine Möglichkeit in .net die richtige Version 2.0 ein Datetime-Objekt für eine andere Zeitzone unterscheidet sich von dem zu erhalten, die die Software auf läuft (andere als UTC).

Das bedeutet jedoch nicht, dass es keinen Weg gibt, es außerhalb von .net zu tun. Schauen Sie sich here in der TimeZoneInformation Klasse an. Diese Klasse bindet einige p/invoke-Daten in das Win O/S ein, um die Zeitzoneninformationen von dem O/S zu erhalten. Ich habe es erfolgreich verwendet, als 2.0 neu war und es hat sehr gut funktioniert. Die Site, an der ich gerade arbeitete, musste in der Lage sein, jedem Benutzer das Datum/die Uhrzeit lokal anzuzeigen, und musste die Sommerzeit beachten, und diese Klasse füllte die Rechnung für uns.

0

Ein Datum Vergleich ist ein Datum Vergleich. DateTime umschließt nur eine Speicherstruktur, die in Ticks definiert ist, und macht Methoden, um auf häufig verwendete Teile des Speichers zuzugreifen, z. Tag oder Jahr oder Zeit oder TimeOfDay usw.

Des Weiteren ist die Umwandlung nur möglich, wenn Sie sowohl die Quelle snd Zielverschiebungen kennen und dann immer die Berechnung ist wie durch -1 * (sourceOffset - destOffset)

gegeben angegeben, dass der Teil der in der Klammer steht Zeitzonenunterschied.

Bitte beachten Sie auch

Get eastern time in c# without converting local time