c# - que - ¿Cuál es la mejor manera de almacenar información de la zona horaria en mi base de datos?
zona horaria utc (1)
Tengo un sitio web asp.net-mvc que asumí y hay una página donde las personas ingresan información y horarios (incluida la zona horaria local). La base de datos persiste una hora de inicio, una hora de finalización y una zona horaria, ya que me parece un poco inestable. Aquí está el código para obtener la lista para elegir:
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 algún defecto con este enfoque? Estoy un poco preocupado al leer aquí que esto proviene localmente de la máquina como qué sucede si las diferentes máquinas tienen configuraciones diferentes. También, tratando de averiguar si todo está listado como UTC o GMT, etc. . ¿Alguna sugerencia mejor? Por ejemplo, ¿debo hacer la conversión a UTC en el sitio web y normalizar todos los tiempos en la base de datos?
Debe almacenar el ID devuelto por TimeZoneInfo.Id
. Ese es el identificador, la cadena que pretende identificar la zona horaria. Usar el nombre para mostrar es una idea realmente mala, ya que puede variar según la cultura y es menos probable que sea estable.
Luego puede usar TimeZoneInfo.FindSystemTimeZoneById
para recuperar la zona desde el ID.
Es cierto que prefiero TZDB para el manejo de la zona horaria, pero eso es un asunto diferente :)