23

我有一个我接管的 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 并规范数据库中的所有时间吗?

4

1 回答 1

36

您应该存储由返回的 ID TimeZoneInfo.Id。这就是标识符 - 用于标识时区的字符串。使用显示名称是一个非常糟糕的主意,因为它可能因文化而异,而且不太可能是稳定的。

然后,您可以使用TimeZoneInfo.FindSystemTimeZoneById从 ID 中检索区域。

诚然,我更喜欢 TZDB 进行时区处理,但那是另一回事 :)

于 2012-07-20T13:34:33.460 回答