DateTime ConvertTimeBySystemTimeZoneId не работает - PullRequest
0 голосов
/ 31 августа 2018

Я экономлю время в базе данных UTC.

И я хочу преобразовать время в местный часовой пояс при получении данных о времени из базы данных.

Вот функция.

    public static List<string> convertListDateTime(List<string> timelist, TimeZoneInfo local)
    {
        for (int i = 0; i < timelist.Count; i++)
        {
            DateTime dt = DateTime.Parse(timelist[i]);
            dt = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dt, local.Id);
            timelist[i] = dt.ToString("yyyy-MM-dd HH:mm:ss");
        }
        return timelist;
    }

timelist - список строк, содержащий данные из базы данных.

Но расписание не меняется. Это то же самое, что и данные базы данных.

Как я могу это сделать?

1 Ответ

0 голосов
/ 31 августа 2018

Это первая проблема:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...