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?
¿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. –
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