我接管了一个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,并规范化数据库中的所有时间吗?
您应该存储TimeZoneInfo.Id
返回的ID。这就是标识符-用于识别时区的字符串。使用显示名称是一个非常糟糕的主意,因为它可能因文化而异,而且不太可能稳定。
然后,您可以使用TimeZoneInfo.FindSystemTimeZoneById
从ID检索区域。
诚然,我更喜欢TZDB进行时区处理,但那是另一回事:)