bestimmt den Beginn eines Tages mit Zeitzonen UND Sommerzeit

8

Ich speichere die Zeitzone des Benutzers als Dezimalzahl in der Sitzung. Wenn der Benutzer beispielsweise in der EST-Zeitzone ist, würde ich

haben %Vor%

Die Daten in der Datenbank werden in UTC gespeichert, daher möchte ich den Anfang und das Ende des Tages für diesen Benutzer berechnen, so dass die Datensätze für die Zeitzone angepasst werden, wenn der Benutzer seine Daten für einen bestimmten Tag möchte. p>

Das mache ich:

%Vor%

Das Problem, das ich habe, ist, dass dies nicht die Sommerzeit berücksichtigt, also sogar EST-Zeit ist 5 Stunden hinter UTC, für den Moment ist es tatsächlich 4 Stunden hinter UTC wegen der Sommerzeitverschiebung.

>

Was sind Ihre Vorschläge? Danke.

    
frenchie 11.09.2011, 23:01
quelle

7 Antworten

9

Um solche Berechnungen durchzuführen, müssen Sie die Klassen TimeZoneInfo und DateTimeOffset verwenden.

Zuerst müssen wir eine TimeZoneInfo Instanz für die lokale Zeit und die lokale Zeit des Benutzers erhalten:

%Vor%

Der Vorbehalt hier ist, dass Sie die ID der lokalen Zeitzone des Benutzers kennen müssen (der Offset, den Sie derzeit haben, wird nicht ausreichen). Sie können eine Liste aller TimeZoneInfo -Instanzen abrufen, die das System mit TimeZoneInfo.GetSystemTimeZones , und dann benötigen Sie eine Möglichkeit, die vom Benutzer angegebene Zeitzone mit einer dieser Zeitzonen abzugleichen.

Für dieses Beispiel habe ich EST fest programmiert.

Dann müssen Sie eine DateTimeOffset -Instanz für die heutige Mitternacht (Tagesbeginn) in Ihrer lokalen Zeitzone erhalten:

%Vor%

Vor diesem Hintergrund können Sie die Instanz DateTimeOffset berechnen, die die Mitternacht von "heute" (basierend auf Ihrer Ortszeit) in der Zeitzone des Benutzers darstellt. Beachten Sie, dass dies, abhängig von den Zeitzonen, in Zukunft möglicherweise für die Zeitzone des Benutzers gilt!

%Vor%

Und schließlich können Sie Zeitstempel für beide Daten wie folgt erstellen:

%Vor%     
Jon 18.09.2011, 15:15
quelle
3

Wie von BrokenGlass erwähnt, reicht ein einfacher Offset nicht aus, um den Umgang mit Tageslicht zu bestimmen, da verschiedene Länder in jeder Zone die Sommerzeit anders verarbeiten können. Die Klasse C # TimeZone ist spezifischer und unterstützt die Sommerzeit (Details finden Sie auf MSDN ). Leider gibt es keine einfache Möglichkeit, die relevante Zeitzone vom Browser abzurufen, aber es gibt mehrere Vorschläge zu diesen Beitrag in Bezug darauf, wie Sie dem Benutzer erlauben können, ihre Zeitzone auszuwählen.

Wenn Sie versuchen möchten, die Zeitzone ohne die Hilfe des Benutzers auszuarbeiten, gibt es ein paar Möglichkeiten (typischerweise um die bevorzugte Sprache des Browsers zu erreichen und diese dann einem Land zuzuordnen ...), einige Beispiele sind hier und hier .

    
Daniel B 12.09.2011 06:03
quelle
3

Sie müssen JavaScript verwenden, um die erforderlichen Informationen aus dem Browser des Benutzers zu erhalten - für diesen Teil siehe Ссылка

Wenn Sie diese Informationen haben, können Sie UserTimeZone (übrigens sollte dies kein int sein, da es Zeitzonen mit Bruchteilen von Stunden gibt!) einrichten, um die aktuelle Zeitzone einschließlich DST ...

zu berücksichtigen     
Yahia 12.09.2011 06:17
quelle
2

Sie sollten nichts davon tun. Sie sollten nur die TimeZoneInfo verwenden, die in .net integriert ist.

Zum Beispiel:

%Vor%

Da Sie anscheinend nicht in der Lage sind, API-Parameter nachzuschlagen, gehen Sie hier:

Ссылка

Ссылка

    
Erik Funkenbusch 17.09.2011 19:32
quelle
2

Die richtige Antwort ist, was alle Ihnen gesagt haben - verwenden Sie die TimeZone-APIs im Framework. Aber vor .NET 3.5 existierten die TimeZoneInfo APIs nicht. Wenn Sie das APIS wirklich nicht verwenden möchten oder etwas vor .NET 3.5 verwenden, finden Sie alle Zeitzoneninformationen in der Registrierung unter

HKLM/Software/Microsoft/Windows NT/CurrentVersion/Timezones

Unter Ссылка gibt es eine Reihe von Klassen, die die Registrierungsdaten direkt lesen und alle benötigten Zeitzonenberechnungen durchführen - mit Anpassungen für die Sommerzeit. Es ist guter Code (wir verwenden ihn seit Jahren zuverlässig) mit der Quelle, so dass Sie sehen können, was sie gerade tun.

    
ScottTx 20.09.2011 21:41
quelle
2

Ich würde empfehlen, den Benutzereinstellungen eine Zeitzone hinzuzufügen und diese zu speichern. Zeitzonen haben je nach Jahreszeit unterschiedliche Zeiten. Sie können eine Liste der Zeitzonen angeben, unter denen der Benutzer auswählen kann, indem Sie TimeZoneInfo.GetSystemTimeZones verwenden Methode. Sie können ein beliebiges Datum als UTC speichern und es (mit der Methode TimeZoneInfo.ConvertTime ) in die Benutzer Zeit bei der Anzeige, und konvertieren Sie es zurück in UTC beim Speichern. Dies ermöglicht dem Benutzer, seine Zeitzone jederzeit zu ändern, ohne Probleme zu verursachen. Wenn Sie diesem Format folgen, sollten Sie keine Probleme haben.

Seien Sie vorgewarnt, wenn Sie die Daten nicht als UTC speichern und wie oben beschrieben konvertieren, kann es zu Problemen kommen. In manchen Zeitzonen gibt es an bestimmten Tagen, an denen von Sommerzeit auf Standardzeit umgestellt wird, keine bestimmten Zeiten. Die TimeZoneInfo-Klasse spielt mit diesen nicht vorhandenen Zeiten nicht gut.

    
Charles Lambert 22.09.2011 03:22
quelle
0

Sie brauchen die Zeitzonendatei Ссылка
Record all you time in UTC/GMT.

Tag Die Lichteinsparung ist nicht konsistent, die Länder ändern ihre DLS-Regel.
Daher benötigt Ihre Anwendung zu jeder Zeit eine aktuelle Tz-Datei.

Ihr Benutzer sollte bei der Anmeldung Time-Zone name und keine Zeitverschiebung wählen. Weil zwei Regionen denselben Zeitversatz haben können (manchmal mit DLS).

Mit Tz Name kannst du wissen - Welcher Land / Region Benutzer gehört zu;
- Was ist his time offset ; - und was ist his DLS offset ,
add these both , um die aktuelle Zeit der Benutzer zu erhalten.

Bekannte Probleme: Die Zeit im Verlauf kann nicht in die tatsächliche Zeit konvertiert werden, wenn Sie keine historischen DLS-Details haben, da diese zu diesem historischen Zeitpunkt möglicherweise nicht gültig sind.

    
Atul Gupta 22.09.2011 20:19
quelle

Tags und Links