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

我有一个asp.net-mvc网站,我接手了一个页面页面,人们输入信息和时间(包括当地时区)。 数据库持续开始时间,结束时间和时区,因为它对我来说感觉有点不稳定。 这是获取列表的代码:

static private IEnumerable 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(); 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并规范化数据库中的所有时间吗?

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

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

不可否认,我更喜欢TZDB进行时区处理,但这是另一回事:)