2012-07-20 24 views
12

Tengo un sitio web asp.net-mvc que asumí y hay una página donde las personas ingresan información y horas (incluida la zona horaria local). La base de datos persiste en una hora de inicio, una hora de finalización y una zona horaria, ya que me parece un poco raro. aquí está el código para obtener la lista para elegir:¿Cuál es la mejor manera de almacenar información de zona horaria en mi base de datos?

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

Así que es simplemente almacenar la cadena completa que se devuelve desde TimeZoneInfo.GetSystemTimeZones()

¿Hay alguna defectos con este enfoque? Estoy un poco preocupado por reading here que esto viene localmente de la máquina como si otras máquinas tuvieran configuraciones diferentes. Además, tratando de averiguar si todo está listado como UTC o GMT, etc. . ¿Alguna mejor sugerencia? Por ejemplo, ¿debo hacer la conversión a UTC en el sitio web y normalizar todas las veces en la base de datos?

+2

¿Qué versión de SQL Server? SQL Server 2008 introdujo ['DATETIMEOFFSET'] (http://msdn.microsoft.com/en-us/library/bb630289 (v = sql.100) .aspx). Todavía tengo que encontrarle un uso (prefiero almacenar el huso horario del usuario una vez, almacenar la fecha como UTC y ajustar por usuario), pero otros afirman que se puede usar para este propósito. –

+0

Hay un inconveniente para almacenar la hora de fecha como UTC en el db. ¿Cómo cuentas para DST en el lado de DB? No hay forma de convertir un DateTime o DateTime2 a la hora local del usuario con respecto a las zonas horarias y el horario de verano. Si pasa una compensación, aún podría estar apagado debido a que un día está en horario de verano y otro no. Ejemplo 3/10/2012 2:00:00 EST es el 3/09/2012 20:00:00 UTC pero el 13/03/2012 2:00:00 EST es el 3/12/2012 19:00:00 UTC. Básicamente un desplazamiento de -4 y -5 respectivamente. Entonces, ¿qué compensación le pasas a tu SP -4 o -5 para convertir el UTC a local? De cualquier manera, uno está equivocado. – aBetterGamer

Respuesta

19

Debe almacenar la ID devuelta por TimeZoneInfo.Id. Ese es el identificador - la cadena que está destinada a identificar la zona horaria. Usar el nombre para mostrar es una muy mala idea, ya que puede variar según la cultura y es menos probable que sea estable.

Puede usar TimeZoneInfo.FindSystemTimeZoneById para recuperar la zona de la ID.

Es cierto que prefiero TZDB para el manejo de zona horaria, pero eso es un asunto diferente :)

+0

¿Puedes arrojar algo más de luz sobre TZDB y por qué lo prefieres? –

+0

@Jon Skeet: solo para aclarar, parece que la propiedad Id también es una cadena (como "Eastern Standard Time"). . ese es el campo que estás sugiriendo que almaceno? – leora

+0

@leora - Vinculado a la documentación, entonces sí, ese es el campo que debe usar. –

Cuestiones relacionadas