我最近在.NET中的时区意识到Web应用程序中与时区弄乱。我提出了以下解决方案的解决方案。
我的解决方案是:
- 让用户配置文件存储他们所在的时区。
- 在Web服务器上进行往返UTC的所有转换。
- 将日期存储在DB中,作为UTC。
我的问题是:
- 你们认为这是.NET中最好的方法吗?
- 在UTC中使用DateTime2足够好,或者我应该将客户储存时间 偏移DB(基本上是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);
}
您的当前方法不是错误,但是您可以通过跟踪偏移来做得更好。
当您谈论偏移时,似乎您正在考虑它们与时区相关联。但是要意识到,大多数时区都有两个不同的偏移,一个是标准时间,一个是在白天的时间。两者的Microsoft时区ID仍然在字符串中具有"标准",因此这可能是混乱的一部分。但是您正在使用的TimeZoneInfo
确实在跟踪标准和日光偏移。
您需要将偏移与每个单独的日期和时间相关联。您可以使用.NET中的DateTimeOffset
类和SQL Server中的datetimeoffset
数据类型来做到这一点。
如果您始终使用这些使用,则需要转换往返UTC的需要。