Я сохраняю дату / время в базе данных как UTC и вычисляю их внутри своего приложения обратно к местному времени на основе определенного часового пояса. Скажем, например, у меня есть следующая дата / время:
01/04/2010 00:00
Скажем, это для страны, например. Великобритания, в которой соблюдается летнее время (летнее время), и в это время мы переходим на летнее время. Когда я конвертирую эту дату в UTC и сохраняю ее в базе данных, она фактически сохраняется как:
31/03/2010 23:00
Поскольку дата будет скорректирована -1 час на летнее время. Это отлично работает, когда вы наблюдаете летнее время во время отправки. Однако что происходит, когда часы возвращаются обратно? Когда я извлекаю эту дату из базы данных и конвертирую ее в местное время, эта конкретная дата-время будет отображаться как 31/03/2010 23:00, тогда как на самом деле она обрабатывалась как 01/04/2010 00:00.
Поправьте меня, если я ошибаюсь, но разве это не недостаток при хранении времени в формате UTC?
Пример преобразования часового пояса
В основном то, что я делаю, - это сохраняю дату / время отправки информации в мою систему, чтобы пользователи могли составить отчет диапазон. Вот как я храню дату / время:
public DateTime LocalDateTime(string timeZoneId)
{
var tzi = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
return TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi).ToUniversalTime().ToLocalTime();
}
Сохранение в формате UTC:
var localDateTime = LocalDateTime("AUS Eastern Standard Time");
WriteToDB(localDateTime.ToUniversalTime());