Отображение даты из БД с учетом местных настроек дневного света - PullRequest
2 голосов
/ 12 сентября 2011

Я использую устаревшее приложение 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 ]

1 голос
/ 12 сентября 2011

Работа с часовыми поясами не так ясна, как вы думаете.

Прочитайте следующую статью Троя Ханта:

http://www.troyhunt.com/2011/08/overcoming-sql-08s-globally-insensitive.html

Он подробно описывает работу с часовыми поясами в .NET, это хорошая статья, которая быстро расскажет вам о подводных камнях (и возможных решениях).

1 голос
/ 12 сентября 2011

Как правило, из .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:

Конвертировать время UTC / GMT по местному времени

0 голосов
/ 12 сентября 2011

Беглый взгляд на MSDN показывает, что вы можете сделать что-то вроде этого

DateTime dt = new DateTime(dateFromDb.Ticks, DateTimeKind.Utc);
DateTime dtLocal = dt.ToLocalTime();

Тогда вы сможете отобразить dtLocal в любом формате, который вы хотите.Было бы настроено местное время с правильными настройками летнего времени

Проверьте MSDN DateTime.ToLocalTime для получения дополнительной информации

Редактировать: Япри условии, что dateFromDb является экземпляром DateTime Class.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...