2012-07-20 3 views
12

Ich habe eine asp.net-mvc-Website, die ich übernahm und es gibt eine Seite Seite, wo Menschen Informationen und Zeiten eingeben (einschließlich lokaler Zeitzone). Die Datenbank besteht aus einer Startzeit, einer Endzeit und einer Zeitzone, da es sich für mich etwas flockig anfühlt. hier ist der Code der Liste zur Auswahl zu erhalten:Was ist der beste Weg Zeitzoneninformationen in meiner Datenbank zu speichern?

static private IEnumerable<SelectListItem> GetTimeZones(string selected) 
    { 
     var timeZoneNames = TimeZoneInfo.GetSystemTimeZones() 
      .Where(tz => tz.DisplayName.Contains("London") 
         || tz.DisplayName.Contains("Hong Kong") 
         || tz.DisplayName.Contains("Mumbai") 
         || tz.DisplayName.Contains("Eastern Time")) 
      .ConvertAll(tz => tz.DisplayName).ToList(); 

     var items = new List<SelectListItem>(); 
     foreach (var item in timeZoneNames) 
     { 
      var slItem = new SelectListItem(); 
      slItem.Text = item; 
      slItem.Value = item; 
      slItem.Selected = item == selected; 
      items.Add(slItem); 
     } 

     return items; 
    } 

So ist es einfach zu speichern Sie die vollständige Zeichenfolge, die von TimeZoneInfo.GetSystemTimeZones()

Gibt es Mängel bei diesem Ansatz zurückgegeben wird? Ich bin ein wenig besorgt reading here, dass dies lokal von der Maschine als was kommt, wenn verschiedene Maschinen unterschiedliche Einstellungen haben. Außerdem versuchen Sie herauszufinden, ob alles als UTC oder GMT usw. . Irgendwelche besseren Vorschläge? Zum Beispiel, sollte ich die Konvertierung zu UTC auf der Website vornehmen und alle Zeiten in der Datenbank normalisieren?

+2

Welche Version von SQL Server? SQL Server 2008 führte ['DATETIMEOFFSET'] (http://msdn.microsoft.com/en-us/library/bb630289 (v = sql.100) .aspx) ein. Ich muss noch eine Verwendung dafür finden (ich würde die Zeitzone des Benutzers lieber einmal speichern, das Datum als UTC speichern und pro Benutzer anpassen), aber andere behaupten, dass sie für diesen Zweck verwendet werden kann. –

+0

Es gibt eine negative Seite, um die Datumszeit als UTC in der Datenbank zu speichern. Wie berücksichtigen Sie DST auf der DB-Seite? Es gibt keine Möglichkeit, eine DateTime oder DateTime2 in die lokale Zeit des Benutzers in Bezug auf Zeitzonen und DST zu konvertieren. Wenn Sie einen Offset übergeben, könnten Sie immer noch aussteigen, weil ein Tag in der Sommerzeit ist und einer nicht. Beispiel 3/10/2012 2:00:00 EST ist 3/09/2012 20:00:00 UTC aber 3/13/2012 2:00:00 EST ist 3/12/2012 19:00:00 UTC. Grundsätzlich ein Offset von -4 bzw. -5. Also welchen Offset gibst du in deinen SP -4 oder -5, um die UTC in local zu konvertieren? So oder so ist man falsch. – aBetterGamer

Antwort

19

Sie sollten die von TimeZoneInfo.Id zurückgegebene ID speichern. Das ist die Kennung - die Zeichenfolge, die die Zeitzone bezeichnen soll. Die Verwendung des Anzeigenamens ist eine wirklich schlechte Idee, da diese je nach Kultur variieren kann und weniger wahrscheinlich stabil ist.

Sie können dann TimeZoneInfo.FindSystemTimeZoneById verwenden, um die Zone von der ID abzurufen.

Zugegebenermaßen bevorzuge ich TZDB für Zeitzone Handhabung, aber das ist eine andere Sache :)

+0

Können Sie etwas mehr Licht auf TZDB werfen und warum bevorzugen Sie es? –

+0

@ Jon Skeet - nur um zu verdeutlichen, es sieht aus wie die ID-Eigenschaft ist auch eine Zeichenfolge (wie "Eastern Standard Time"). . das ist das Feld, das du vorschlägst? – leora

+0

@leora - Er hat die Dokumentation verlinkt, also ja, das ist das Feld, das Sie verwenden sollten. –

Verwandte Themen