2013-03-28 3 views
5

Я знаю, что мы можем изменить текущую культуру для текущего потока. И я знаю, что мы не могли получить TimeZoneInfo от CurrentCulture, потому что одна культуры может имеет много TimeZonesкак СШАКак установить часовую зону на поток?

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

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

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

Мы не желательные возможности для .NET сайта, мы твердый ответ на сайт твердых вопросов. Обработка часового пояса в большинстве случаев нетривиальна, добавление слоя сложности часового пояса в потоке просто вызывает проблемы – Petesh

+0

@Petesh Я не хотел спрашивать, почему на самом деле. Мне было интересно, если это возможно. –

+1

Нет ничего, что помешало бы вам создать локально-локальный объект для часовых поясов, просто ничего, кроме вашего кода, не будет использовать его. Вы должны посмотреть на ['ThreadLocal ' Class] (http://msdn.microsoft.com/en-us/library/dd642243.aspx) в .NET для тривиального способа его реализации. – Petesh

ответ

5

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

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

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

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

Но вместо этого вы должны просто преобразовать из UTC в соответствующих случаях:

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

Временная зона используется неявно в ряде различных функций (например, преобразование из строки в дату-время с помощью 'AdjustToUniversal'). Их можно, безусловно, изменить вручную, чтобы использовать явную часовую зону, но это не так просто в большой базе кода. Точно так же вы можете явно указать культуру для использования в таких функциях, как 'string.Format()' - но там у вас есть альтернатива установить культуру для потока и «исправить их все» за один раз. – MiMo

+2

Да, он используется внутренне многими функциями, но нет - вы не можете его изменить. Нет крючков, и все запечатано. Можно было бы подумать, что это будет вести себя как cultureinfo, но это не так. Совсем другое. Существует только единая системная настройка часового пояса. –

+0

Да, я знаю - мой предыдущий комментарий был попыткой ответить на ваш вопрос: «Что такое (будет)« случай использования »такой вещи - если бы оно существовало. – MiMo

Смежные вопросы