Вопрос по timezone-offset, timezone, sql-server, c# – Каков наилучший способ хранения информации о часовом поясе в моей БД?

17

У меня есть сайт 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 на веб-сайте и нормализовать все время в базе данных?

Существует один недостаток хранения даты и времени в формате UTC в БД. Как вы учитываете DST на стороне БД? Невозможно преобразовать DateTime или DateTime2 в местное время пользователя по отношению к часовым поясам и летнему времени. Если вы передадите смещение, то вы все равно можете быть отключены из-за того, что один день был в летнее время, а другой - нет. Пример 3/10/2012 2:00:00 EST - 3/09/2012 20:00:00 UTC, но 13.03.2012 2:00:00 EST - 12.03.2012 19:00:00 UTC. В основном смещение -4 и -5 соответственно. Итак, какое смещение вы передаете в SP -4 или -5 для преобразования UTC в местное? В любом случае, один не прав. aBetterGamer
Какая версия SQL Server? SQL Server 2008 представленDATETIMEOFFSET, Мне еще только предстоит найти его применение (я бы предпочел сохранить часовой пояс пользователя один раз, сохранить дату как UTC и настроить для каждого пользователя), но другие утверждают, что он может использоваться для этой цели. Aaron Bertrand

Ваш Ответ

1   ответ
24

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

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

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

Можете ли вы пролить свет на TZDB и почему вы предпочитаете это?
Есть ли разница между Mono и .Net для этого?
@leora - Он связан с документацией, так что да, это поле, которое вы должны использовать.
@Ramhound - я видел это, я был просто удивлен, что идентификатор был описательной строкой (в отличие от некоторого числа) leora
@Jon Skeet - просто чтобы уточнить, похоже, что свойство Id также является строкой (например, "Eastern Standard Time"). , это поле, которое вы предлагаете мне хранить? leora

Похожие вопросы