我最近在.net中的时区感知Web应用程序中乱搞了时区。我已经提出了以下处理时区的解决方案。
我的解决方案是:
我的问题是:
以下是时间转换的示例代码。
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);
}
答案 0 :(得分:1)
您当前的方法不是错误,但您可以通过跟踪偏移来做得更好。
当你谈论抵消时,似乎你认为它们与时区有关。但要意识到大多数时区有两个不同的偏移,一个用于标准时间,一个用于日光时间。两者的Microsoft时区ID在字符串中仍然具有“标准”,因此这可能是混淆的一部分。但是你正在使用的TimeZoneInfo
确实跟踪标准和日光偏移。
您需要将偏移量与每个日期和时间相关联。你可以使用.Net中的DateTimeOffset
类和SQL Server中的datetimeoffset
数据类型。
如果你一直使用这些,那么转换到UTC的需求就会消失。