2012-07-20 14 views
12

Ho un sito Web asp.net-mvc che ho rilevato e c'è una pagina in cui le persone inseriscono informazioni e orari (incluso fuso orario locale). Il database sta continuando un orario di inizio, un'ora di fine e un fuso orario perché mi sembra un po 'squilibrato. ecco il codice per ottenere l'elenco tra cui scegliere:Qual è il modo migliore per memorizzare le informazioni sul fuso orario nel mio DB?

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; 
    } 

Così la sua semplicemente memorizzare la stringa completa che viene restituito dal TimeZoneInfo.GetSystemTimeZones()

ci sono eventuali difetti con questo approccio? Sono un po 'preoccupato reading here che proviene localmente dalla macchina come se le macchine diverse hanno impostazioni diverse. Inoltre, cercando di capire se tutto è elencato come UTC o GMT, ecc. . Qualche suggerimento migliore? Ad esempio, devo effettuare la conversione in UTC sul sito Web e normalizzare tutte le volte nel database?

+2

Quale versione di SQL Server? SQL Server 2008 ha introdotto ['DATETIMEOFFSET'] (http://msdn.microsoft.com/en-us/library/bb630289 (v = sql.100) .aspx). Devo ancora trovarne un uso (preferirei memorizzare il fuso orario dell'utente una volta, memorizzare la data come UTC, e regolare per utente), ma altri sostengono che può essere usato per questo scopo. –

+0

C'è un lato in basso per memorizzare l'ora della data come UTC nel db. Come si tiene conto dell'ora legale sul lato DB? Non c'è modo di convertire un DateTime o DateTime2 all'ora locale dell'utente rispetto ai fusi orari e all'ora legale. Se superi un offset, potresti comunque essere disattivato a causa del fatto che un giorno è in DST e uno no. Esempio 3/10/2012 2:00:00 EST è 3/09/2012 20:00:00 UTC, ma 13/03/2012 14:00:00 EST è il 3/12/2012 19:00:00 UTC. Fondamentalmente un offset di -4 e -5 rispettivamente. Quindi quale offset passi nel tuo SP -4 o -5 per convertire l'UTC in locale? In ogni caso, uno è sbagliato. – aBetterGamer

risposta

19

È necessario memorizzare l'ID restituito da TimeZoneInfo.Id. Questo è l'identificatore: la stringa intesa per identifica il fuso orario. L'uso del nome visualizzato è una pessima idea, in quanto può variare in base alla cultura ed è meno probabile che sia stabile.

È quindi possibile utilizzare TimeZoneInfo.FindSystemTimeZoneById per recuperare la zona dall'ID.

Certo preferisco TZDB per la gestione del fuso orario, ma questo è un altro discorso :)

+0

Riesci a fare più luce su TZDB e perché preferisci? –

+0

@Jon Skeet - Giusto per chiarire, sembra che la proprietà Id sia anche una stringa (come "Eastern Standard Time"). . questo è il campo che stai suggerendo di archiviare? – leora

+0

@leora - Si è collegato alla documentazione, quindi sì, questo è il campo che dovresti usare. –

Problemi correlati