Я храню дату/время в базе данных в формате UTC и вычисляю их в своем приложении обратно в локальное время на основе определенного часового пояса. Скажем, например, у меня есть следующая дата/время:
01/04/2010 00:00
Скажите, что это для страны, например. Великобритания, которая соблюдает летнее время (летнее время), и в это конкретное время мы находимся в летних сбережениях. Когда я конвертирую эту дату в UTC и сохраняю ее в базе данных, она фактически сохраняется как:
31/03/2010 23:00
Поскольку дата будет скорректирована на 1 час для летнего времени. Это отлично работает, когда вы наблюдаете DST во время подачи. Однако что происходит, когда часы отрегулированы назад? Когда я вытаскиваю эту дату из базы данных и преобразую ее в локальное время, то конкретное время datetime будет считаться 31/03/2009 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());