我使用旧版DMS应用程序,该应用程序使用GMT 0(格林威治)作为默认时区存储日期,并对其应用1小时差价。我必须使用GridView显示这些记录,我需要根据系统运行的相对位置应用一种转换(例如伦敦,巴哈马)。
看看遗留系统如何处理日期,我设计了以下算法来正确显示日期(我的代码基于asp.net / C#):
//Example for Bahamas, GMT: -5 Hours as offset, I should add 4 hours to the DB date
//Example for London, GMT: 0 Hour as offset, I should add 1 hour to the DB date
DateTime dateToDisplay;
int spreadHours = 0;
TimeZone cur = TimeZone.CurrentTimeZone;
DaylightTime daylight = cur.GetDaylightChanges(dateFromDb.Year);
DateTime start = daylight.Start;
DateTime end = daylight.End;
if (dateFromDb.CompareTo(start) <= 0 || dateFromDb.CompareTo(end) >= 0)
{
spreadHours = -1 - (cur.GetUtcOffset(dateFromDb).Hours);
}
else
{
spreadHours = - (cur.GetUtcOffset(dateFromDb).Hours);
}
dateToDisplay = dateFromDb.AddHours(spreadHours);
但是我不确定在这个过程中我是否可以涵盖所有案例,或者是否有更好的解决方案来实现相同的结果。
任何人都可以证实我的想法或建议更好的道路吗?
答案 0 :(得分:1)
一般来说,从.NET 3.5开始,你可以/应该使用TimeZoneInfo类,
实际上要从UtcDateTime转换为本地时间,您需要做的就是:
// here static text but you can initialize the TimeZoneInfo with any Id, check MSDN for this:
// http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx
string nzTimeZoneKey = "New Zealand Standard Time";
TimeZoneInfo nzTimeZone = TimeZoneInfo.FindSystemTimeZoneById(nzTimeZoneKey);
DateTime nzDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, nzTimeZone);
你可以在SO中查看其他问题和答案:
答案 1 :(得分:1)
处理时区并不像你想象的那么明确。
阅读Troy Hunt的以下文章:
http://www.troyhunt.com/2011/08/overcoming-sql-08s-globally-insensitive.html
他详细介绍了如何处理.NET中的时区,这是一篇很好的文章,可以快速告诉您陷阱(和可能的解决方案)是什么。
答案 2 :(得分:0)
快速浏览MSDN建议你可以做这样的事情
DateTime dt = new DateTime(dateFromDb.Ticks, DateTimeKind.Utc);
DateTime dtLocal = dt.ToLocalTime();
然后您可以以任何您想要的格式显示dtLocal。它将通过正确的夏令时设置调整到当地时间
查看MSDN DateTime.ToLocalTime了解详情
编辑:我在这里假设 dateFromDb 是 DateTime 类的实例。