2009-08-24 4 views
39

Auf meiner Website muss ich wissen, in welchen Zeitzonen Menschen sich befinden, um ihnen Nachrichten zur richtigen Zeit anzuzeigen. Ich bin mir nicht sicher, wonach ich in Bezug auf ein Tutorial suchen sollte.Zeitzonen in ASP.NET MVC?

Was ich vorhabe ist zu tun: wenn ein Benutzer zu meiner Website kommt, werden sie ihre Zeitzone durch Auswahl aus einer Dropdown-Liste einstellen. Ich werde ihre Einstellungen in meiner Datenbank speichern und verwenden, um die Zeiten zu berechnen.

Ich bin mir nicht sicher, was ich brauche. Was sollte meine Datenbankzeit speichern? Ich habe irgendwo gelesen, dass es als UTC gespeichert werden sollte. Wie richte ich meine Datenbank dafür ein? Außerdem werde ich auf einer Shared-Hosting-Site sein, so dass es so eingestellt werden muss, dass ich es tun kann (vielleicht über webconfig?).

Als nächstes würde ich eine Liste aller Zeitzonen als HTML-Helfer oder normales HTML benötigen. Ich möchte wirklich keinen machen.

Dann, wie ich schon sagte, brauche ich ein Tutorial, das mir zeigt, was zu tun ist. Ich denke, es ist das Hinzufügen und Subtrahieren von Dingen aus dieser Zeit, aber ich könnte falsch liegen.

Antwort

36

Zu diesem Zweck sollten Sie Ihre Zeitstempel unbedingt in UTC in der Datenbank speichern.

Wenn Sie ein Datum aus der Datenbank auf Ihrer Website angezeigt werden müssen, können Sie dies tun:

DateTime stamp = /* get datetime from the database here, make sure you 
        use the constructor that allows you to specify the 
        DateTimeKind as UTC. */ 

//E.g. 
//DateTime stamp = new DateTime(2009, 12, 12, 12, 12, 12, DateTimeKind.Utc); 

timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(" /* users time zone here */"); 
var convertedTime = TimeZoneInfo.ConvertTime(stamp, timeZoneInfo); 

//Print out the date and time 
//Console.WriteLine(convertedTime.ToString("yyyy-MM-dd HH-mm-ss")); 

Die Liste der Zeitzonen ist bereits in .Net, so dass Sie this post on how to enumerate them sehen können. Bei ASP.Net MVC sollten Sie die konvertierte Datumseinstellung einer Eigenschaft der Modellklasse zuweisen, damit sie nicht für die Anzeige verwendet wird, anstatt das Zeitlimit zu drucken.

+0

Hallo Danke Ich werde versuchen, dies zu implementieren. Ich habe ein anderes unbekanntes. Ist der Benutzer auf meiner Website und ich möchte durch die db gehen und sehen, welche Nachrichten angezeigt werden, basierend auf ihrer Zeitzone. Also würde ich zuerst herausfinden, was ihre Zeit ist und dann in UTC konvertieren? mach dann wo mit? So etwas umgekehrt, was du in deinem Beispiel tust? – chobo2

+0

Nun, anfangs haben Sie erwähnt, dass der Benutzer seine Zeitzone einstellen darf. Es gibt jedoch eine Reihe von Methoden, um die Zeitzone des Benutzers über Javascript zu ermitteln. Sie können in stackoverflow nach weiteren Informationen suchen, zum Beispiel über diesen Beitrag: http://stackoverflow.com/questions/1017053/finding-the-clients-timezone- und-culture-via-web-service – womp

+0

Mir geht es gut mit ihnen ihre Zeitzone auswählen und nicht wirklich in Javascript gerade jetzt suchen wollen. Ich würde nur sagen, würde das sein, wie ich anfangen würde, nach bestimmten Daten in meinem db zu suchen? Durch den Versuch, zurück in UTF zu konvertieren? – chobo2

2

Überprüfen Sie zuerst MSDN für DateTime-Dokumentation und lesen Sie es auf. Here is an article zu Best Practices mit DateTime, die Zeitzonen und UTC abdecken.

Ja, Sie sollten UTC in Ihrer Datenbank speichern. Wenn Sie DateTimes als UTC speichern, können Sie die Zeiten basierend auf der ausgewählten Zeitzone zu (und von) Benutzern übersetzen. Du bist auf dem richtigen Weg!

9

Ich kann nicht betonen, wie wichtig es ist, UTC für die Speicherung und Verarbeitung für jede Anwendung, die Sie schreiben, zu verwenden. Selbst wenn Sie wissen, dass die Anwendung immer nur in einer einzigen Zeitzone verwendet wird, ist es immer noch viel einfacher, mit UTC als mit einer lokalen Zeitzone zu arbeiten, da es Probleme mit der Sommerzeit gibt.

Es gibt wirklich nichts Besonderes, was Sie auf der Datenbankebene tun müssen. Erstellen Sie einfach eine normale Datetime-Spalte, aber stellen Sie sicher, dass eindeutig dokumentiert ist, dass die Spalte UTC ist.

Ich werde ehrlich sein, asp.net ist nicht meine Expertise, aber ich denke, Sie könnten die Zeitzone von der Client-Anfrage irgendwie erhalten. Da die Regeln für die Sommerzeit abhängig von der Region ziemlich unklar sind, ist es möglicherweise besser, ein Java-Skript zu verwenden, das den UTC-Offset berechnet und für die Konvertierung verwendet. Auch nach dem Energy Policy Act von 2005 gibt es immer noch einige Ausnahmen zu den DST-Regeln, die auf der Serverseite eher schwer zu handhaben wären. Ich denke jedoch, dass Sie die Idee haben, dem Kunden zu erlauben, seine eigene Zeitzone einzustellen, die in den meisten Fällen gut funktionieren würde.