2012-04-06 8 views
0

Ich arbeite auf einer asp.net-Website, die Clients Ereignisse erstellen und Benutzer für diese Ereignisse registrieren. Nachdem ich viel darüber gelesen habe, wie man Datetime speichert und anzeigt, bin ich immer noch verwirrt darüber, welche Route ich nehmen soll.Zeitzone bewusste asp.net Website für Ereignisse: UTC vs lokale Datetime

Die am meisten akzeptierte Lösung (nach der Suche nach dem Thema) ist alles in UTC speichern und Client-Zeitzone Offset für die Anzeige subtrahieren. Die Alternative wäre, die Datetime in der Zeitzone des Ereignisses zu speichern (Ortszeit des Ereignisses, nicht Server) und diese auf Anforderung dem Client anzuzeigen. Wäre das nicht effizienter? Fehle ich etwas? Wird die Sommerzeit so berücksichtigt?

Vielen Dank im Voraus.

+0

Es wird auf lange Sicht viel einfacher sein, UTC für alle Zeitstempel in Ihrer Anwendung zu verwenden und basierend auf Benutzerzeitzone anzupassen – Greg

Antwort

1

Alles in UTC zu speichern ist aus gutem Grund der Standard.

Ihre Alternative, Ihre Ereignisse in lokaler Zeit zu speichern, führt zu Verwirrung bei Benutzern in verschiedenen Zeitzonen, wenn das Ereignis tatsächlich stattgefunden hat.

+0

Sie haben absolut Recht Jeff, aber da ein Ereignis zu einem Client gehört und nicht alle, warum das verursacht Verwirrung? Wenn die Startzeit des Ereignisses angezeigt wird, ist es nicht logisch anzunehmen, dass die angezeigte Zeit die Ortszeit ist? –

+0

Datumsangaben werden meistens in derselben Zeitzone wie der Client angezeigt. So bin ich zum Beispiel in EST, also werden mir alle Daten, die ich normalerweise in Foren usw. sehe, in EST angezeigt. – Khan

+0

Die einfachste Methode zur Übersetzung besteht darin, einen Zeitstempel in UTC zu erfassen und ihn dann in die Zeitzone des Clients zu übersetzen. In meinem Beispiel sind alle Zeitstempel, die ich sehe, UTC -5 Stunden. – Khan

0

, wenn Sie mit C# asp.net

  1. in DB speichern

Datetime CurrntDate = DateTime.SpecifyKind (DateTime.Now, DateTimeKind.Unspecified); var _utc = TimeZoneInfo.ConvertTimeToUtc (CurrntDate, TimeZoneInfo.Local);

  1. Get von db Datum und konvertiert, wie pro Client Zeitzone und Display.

Es wird Konsistenz in Ihre Geschäftslogik setzen.

+0

Ich sehe Ihren Punkt Sunil. Vielen Dank. Übrigens sollte die Konvertierungsfunktion TimeZoneInfo.ConvertTimeToUtc (CurrntDate, TimeZoneInfo.Local) sein; –

+0

Danke für den Kommentar, ich werde meine Antwort aktualisieren. –

1

Mit Hilfe der Lage Zeitzone des Ereignisses als Referenzpunkt, können wir dies tun, um die aktuelle Ortszeit (in .NET 3.5 oder 4.0) zu erhalten:

string EventTimeZoneId = "GTB Standard Time"; // for instance, this should be stored in DB as varchar[32] 
DateTime EventLocalTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, EventTimeZoneId); 

Dies berücksichtigt auch die Sommerzeit. Der einzige Nachteil, den ich mir vorstellen kann, ist, dass, wenn der Kunde die falsche Zeitzone wählt, während er ein Event erstellt, alle Registrierungen eine falsche Zeit haben.