Я храню продукт в db. Все даты (sql server datetime) - это UTC, а вместе с датами я храню идентификатор часового пояса для этого продукта. Пользователь вводит даты, когда продукт доступен "от" и "до" в листинге. Поэтому я делаю что-то вроде:
// Convert user datetime to UTC
var userEnteredDateTime = DateTime.Parse("11/11/2014 9:00:00");
// TimeZoneInfo id will be stored along with the UTC datetime
var tz = TimeZoneInfo.FindSystemTimeZoneById("FLE Standard Time");
// following produces: 9/11/2014 7:00:00 AM (winter time - 1h back)
var utcDateTime = TimeZoneInfo.ConvertTimeToUtc(userEnteredDateTime, tz);
и сохраните запись. Предположим, что пользователь сделал это 1 августа, в то время как его часовой пояс, смещенный на UTC, все еще равен +03: 00, тем не менее сохраненная дата для будущего списка имеет правильное значение +02: 00, потому что конверсия учитывала "зимний" период, времени для этого периода.
Вопрос в том, какое значение будет иметь значение datetime, если я попытаюсь преобразовать этот продукт с даты "от" и "до" в локальный часовой пояс продукта 11/11/2014, если, например, из-за некоторых новых правил переход к зимнему времени было отказано, поэтому часовой пояс все еще +03: 00 вместо +02: 00?
// Convert back
var userLocalTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, tz);
Я получу 10AM или верну 9AM, потому что патч OS/.NET справится с этим?
Спасибо!
PS: TimeZoneInfo имеет метод ToSerializedString(), если я скорее сохраню это значение вместо идентификатора часового пояса, это будет гарантировать, что через UTC datetime + serialized timezoneinfo я всегда смогу преобразовать исходный вход datetime пользователя?