在我的数据库中存储时区信息的最佳方法是什么?

24

我接手了一个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等方式列出。是否有更好的建议?例如,我应该在网站上进行转换,规范化数据库中的所有时间吗?


2
SQL Server的哪个版本?SQL Server 2008引入了DATETIMEOFFSET。我还没有找到它的用途(我更愿意将用户的时区存储一次,将日期存储为UTC,并根据用户进行调整),但其他人声称它可以用于此目的。 - Aaron Bertrand
将日期时间存储为UTC在数据库中有一个缺点。如何在数据库端考虑夏令时?无法将DateTime或DateTime2转换为用户本地时间,涉及到时区和夏令时。如果传递偏移量,则由于一天处于夏令时而另一天不处于夏令时,因此仍可能存在误差。例如,2012年3月10日2:00:00 EST是2012年3月9日20:00:00 UTC,但2012年3月13日2:00:00 EST是2012年3月12日19:00:00 UTC。基本上分别为-4和-5的偏移量。因此,您要将哪个偏移量传递到SP以将UTC转换为本地时间?无论如何都会有一个是错误的。 - aBetterGamer
1个回答

39

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

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

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


@Jon Skeet - 只是为了澄清一下,看起来 Id 属性也是一个字符串(像 "Eastern Standard Time" 一样). . 你建议我存储的就是这个字段? - leora
@leora - 他链接到了文档,所以是的,那就是你应该使用的字段。 - Security Hound
3
@Ramhound - 我看到了,只是惊讶Id是一个描述性字符串(而不是一些数字)。 - leora
这方面Mono和.Net有区别吗? - Richard B
@ChristianRios:IdTimeZoneInfo的实例属性。换句话说,我建议您使用从您感兴趣的任何TimeZoneInfo获取的Id属性。 - Jon Skeet
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接