Это первая проблема:
DateTime dt = DateTime.Parse(timelist[i]);
Вы не сказали, что значение равно в UTC, поэтому предполагается, что оно указано по местному времени. Преобразование из этого в местное время не допускается. Вы можете исправить это при разборе, сказав, что вход находится в UTC, и вы хотите, чтобы вывод тоже был в UTC:
DateTime dt = DateTime.ParseExact(
timelist[i],
"yyyy-MM-dd HH:mm:ss",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal);
Но, во-вторых, вы все равно должны стараться избегать всего этого преобразования строк: если вы храните значения в базе данных как DateTime
значения вместо строк, это значительно упрощает процесс.
Я бы попытался использовать значения как DateTime
в максимально возможной степени - преобразовывать в строки только тогда, когда это абсолютно необходимо, и в идеале не как часть операция, которая также выполняет изменения часового пояса.
Наконец, вместо использования ConvertTimeBySystemTimeZoneId
, если у вас уже есть TimeZoneInfo
, вы можете использовать его напрямую:
DateTime convertedValue = TimeZoneInfo.ConvertTimeFromUtc(utcValue, zoneInfo);