我最近在 .net 中的时区感知 Web 应用程序中一直在搞乱时区。我提出了以下处理时区的解决方案。
我的解决方案是:
- 让用户配置文件存储他们所在的时区。
- 在 Web 服务器上进行与 UTC 的所有转换。
- 将数据库中的日期存储为 UTC。
我的问题是:
- 你们认为这是.net 中最好的方法吗?
- 在 UTC 中使用 datetime2 是否足够好,或者我应该将客户时间与偏移量存储在数据库中(基本上是 10-10-2012 4:00:00 vs 10-10-2012 00:00:00 4:00)?
- 顺便说一句,你们中的一些人可能会注意到,虽然跨 DST 的跳转是在服务器代码中处理的,但将偏移量传递给 DB 上的 SP 等将无法正确处理 DST。对此有什么想法吗?
这是时间转换的示例代码。
private TimeZoneInfo GetTimeZoneInfo()
{
var timeZone = TimeZoneDropdown.SelectedValue;
switch (timeZone)
{
case "Eastern":
return TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
case "Central":
return TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
case "Mountain":
return TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
case "Pacific":
return TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
case "Alaskan":
return TimeZoneInfo.FindSystemTimeZoneById("Alaskan Standard Time");
}
return TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
}
public DateTime ConvertLocalDateTimeToUtc(DateTime dateTime)
{
var timeZone = GetTimeZoneInfo();
return TimeZoneInfo.ConvertTimeToUtc(DateTime.SpecifyKind(dateTime, DateTimeKind.Unspecified), timeZone);
}
public DateTime ConvertUtcToLocalDateTime(DateTime dateTime)
{
var timeZone = GetTimeZoneInfo();
return TimeZoneInfo.ConvertTimeFromUtc(DateTime.SpecifyKind(dateTime, DateTimeKind.Utc), timeZone);
}