Получить дату времени по другому часовому поясу? - PullRequest
0 голосов
/ 18 января 2020

Следующий код вернет правильную дату по часовому поясу. TimeZoneInfo.ConvertTimeBySystemTimeZoneId не достаточно быстро в моем случае. Это более быстрый способ?

// Return the date part of t by tz
DateTime GetDateByTZ(DateTimeOffset t, string tz)
{
    return TimeZoneInfo.ConvertTimeBySystemTimeZoneId(t, tz).Date;
}

var t1 = DateTimeOffset.Parse("1/17/2020 21:00 -5");
GetDateByTZ(t1, 'GMT Standard Time') // returns 2020-1-18

Мне нужна супер быстрая версия GetDateByTZ.

Я обнаружил, что использование t.AddHours(...).Date намного быстрее, но тогда мне нужно будет вести таблицу поиска смещения по часам, а также логи c для изменения летнего времени (https://en.wikipedia.org/wiki/Daylight_saving_time) .

Например, если я нахожусь в Лондоне, я могу позвонить DateTime.Now.AddHours(-5).Date, чтобы узнать дату «Восточного стандартного времени». Однако летом мне нужно будет изменить -5 на -4.

1 Ответ

0 голосов
/ 18 января 2020

Не уверен, что у нас достаточно информации от вас (см. Комментарии к вашему вопросу), но я укажу, что это:

DateTimeOffset result = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dateTimeOffset, timeZoneId)

... эквивалентно этому:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
DateTimeOffset result = TimeZoneInfo.ConvertTime(dateTimeOffset, tzi);

Таким образом, если вы неоднократно работаете с одной и той же зоной, вы можете получить несколько лучшие результаты, посмотрев TimeZoneInfo объект один раз и удерживая его для повторного использования в будущих преобразованиях.

Я говорю только немного быстрее, потому что и FindSystemTimeZoneById, и ConvertTimeBySystemTimeZoneId используют внутренний кеш. Таким образом, вы не сокращаете распределение, а просто время, которое требуется для поиска элемента из кэша.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...