Я новичок как в .NET, так и в stackoverflow, так что я могу ошибаться, но здесь идет речь:
Использование TimeZoneInfo.ConvertTimeFromUtc обеспечит переход на летнее время и преобразование в правильное время в соответствии с часовым поясом + возможное смещение летнего времени. Однако - само смещение в результирующем объекте будет показывать смещение для стандартного времени, а не учитывать летнее время. Поэтому, если вы хотите создать ToString для объекта, вы получите правильное время (в часах и минутах), но с неправильным смещением во время перехода на летнее время, что может привести к неправильному моменту времени позже в коде.
Если вместо этого вы используете GetUtcOffset, чтобы получить смещение в течение определенного времени, а затем выполните ToOffset для объекта DateTimeOffset, часы и минуты и само смещение будут правильно преобразованы, и вы можете безопасно сделать ToString.
string ExpectedDateTimePattern = "yyyy'-'MM'-'dd'T'HH':'mm':'ss''zzz";
string timeZoneId = "FLE Standard Time";
string dateTimestr = "2017-10-09T09:00:00+02:00";
DateTimeOffset dto = DateTimeOffset.Parse(dateTimeStr);
TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
TimeSpan offset = zone.GetUtcOffset(dto);
dto = dto.ToOffset(offset);
string localTime = dto.ToString(ExpectedDateTimePattern);
localTime вернет "2017-10-09T10: 00: 00 + 03: 00".
datetimeoffset timezoneinfo getutcoffset