Как установить часовую зону на поток?

Я знаю, что мы могли бы изменить текущую культуру для текущего потока. И я знаю, что мы не могли получить TimeZoneInfo из CurrentCulture , потому что у одной культуры может быть много TimeZones, таких как USA

Но использовать тот же метод для работы с TimeZone для текущего потока.

Было бы очень приятно, если бы мы могли сделать что-то вроде этого:

TimeZone.CurrentTimeZone = TimeZoneInfo.FindSystemTimeZoneById("timezone id");

Ответ 1

К сожалению, любая концепция "текущего" часового пояса привязана к настройкам операционной системы, на которых работает код. Есть несколько Win32 apis для изменения часового пояса, но я не рекомендую их использовать. Они не только не "потокобезопасны", но и не являются "безопасными для процесса". Настройка часового пояса влияет на все, что выполняется на машине.

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

Например, скажите, что вы искали текущее время в каком-то другом часовом поясе. Возможно, вы ищете возможность сделать это:

using (TimeZone.CurrentTimeZone = ...  )
{
    var now = DateTime.Now;
}

Но вместо этого вы должны просто конвертировать из UTC, если это необходимо:

var now = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
                       DateTime.UtcNow, "some other timezone id");