Вы не регулируете дату для изменений летнего времени в зависимости от того, наблюдаете ли вы в настоящее время за ними - вы настраиваете ее в зависимости от того, наблюдается ли летнее время в тот момент, когда вы описываете . Так что в случае с январём корректировка не будет применена.
Там есть проблема, однако, некоторые местные времена неоднозначны. Например, 1:30 утра 31 октября 2010 года в Великобритании может представлять собой UTC 01:30 или UTC 02:30, потому что часы возвращаются с 2:00 до 1:00. Вы можете получить любой момент , представленный в UTC, по местному времени, которое будет отображаться в этот момент, но операция необратима.
Точно так же вы можете иметь местное время, которого никогда не бывает - например, 1:30 28 марта 2010 года в Великобритании не произошло - потому что в 1:00 часы подскочили вперед до 2 часов утра. * 10101 *
Короче говоря, если вы пытаетесь изобразить момент времени, вы можете использовать UTC и получить однозначное представление. Если вы пытаетесь представить время в определенном часовом поясе, вам понадобится сам часовой пояс (например, Европа / Лондон) и либо UTC-представление момента, либо местная дата и время со смещением в это конкретное время. (для устранения неоднозначности вокруг переходов DST). Другая альтернатива - только хранить UTC и смещение от него; это позволяет вам определять местное время в этот момент, но это означает, что вы не можете предсказать, какое местное время будет через минуту, поскольку вы на самом деле не знаете часовой пояс. (Это то, что DateTimeOffset
хранит, в основном.)
Мы надеемся сделать это достаточно просто для обработки в Время Нода , но вам все равно нужно будет осознавать, что это возможно.
EDIT:
Код, который вы показали, неверен. Вот почему Я изменил структуру кода, чтобы его было легче увидеть, но вы увидите, что он выполняет те же вызовы.
var tzi = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");
var aussieTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi);
var serverLocalTime = aussieTime.ToLocalTime();
var utcTime = serverLocalTime.ToUniversalTime();
Итак, давайте подумаем прямо сейчас - это 13:38 по местному времени (UTC + 1, в Лондоне), 12:38 UTC, 22:39 в Сиднее.
Ваш код даст:
aussieTime = 22:39 (correct)
serverLocalTime = 23:39 (*not* correct)
utcTime = 22:39 (*not* correct)
Вы должны не звонить ToLocalTime
по результату TimeZoneInfo.ConvertTimeFromUtc
- он будет предполагать, что он вызывается по UTC DateTime
(если только он не получил DateTimeKind.Local, который он выиграл ' т в этом случае).
Так что, если вы точно сохраняете 22:39 в этом случае, вы не точно сохраняете текущее время в UTC.