Каков наилучший способ хранения информации о часовом поясе в моей БД?

У меня есть веб-сайт asp.net-mvc, который я взял, и есть страница, на которой люди вводят информацию и время (включая локальный часовой пояс). В базе данных сохраняется время начала, время окончания и часовой пояс, поскольку для меня это немного неприятно. вот код, чтобы получить список на выбор:

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

Таким образом, он просто сохраняет полную строку, которая возвращается из TimeZoneInfo.GetSystemTimeZones()

Есть ли недостатки в этом подходе? Я немного обеспокоен здесь, чтобы прочитать, что это происходит локально с машины, так как, если разные машины имеют разные настройки. Кроме того, пытаясь выяснить, все ли указано как UTC или GMT и т.д., Любые лучшие предложения? Например, должен ли я сделать преобразование в UTC на веб-сайте и нормализовать все время в базе данных?

Ответ 1

Вы должны сохранить идентификатор, возвращенный TimeZoneInfo.Id. Это идентификатор - строка, которая предназначена для идентификации часового пояса. Использование отображаемого имени - действительно плохая идея, поскольку это может варьироваться в зависимости от культуры и менее вероятно, что оно будет стабильным.

Затем вы можете использовать TimeZoneInfo.FindSystemTimeZoneById для извлечения зоны из идентификатора.

По общему признанию, я предпочитаю TZDB для обработки часовых поясов, но это другое дело:)