从DB调整到本地日光设置的显示日期

时间:2011-09-12 11:52:36

标签: c# asp.net datetime

我使用旧版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);

但是我不确定在这个过程中我是否可以涵盖所有案例,或者是否有更好的解决方案来实现相同的结果。

任何人都可以证实我的想法或建议更好的道路吗?

3 个答案:

答案 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中查看其他问题和答案:

Convert UTC/GMT time to local time

答案 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 类的实例。