2013-03-28 4 views
5

현재 스레드의 현재 문화권을 변경할 수 있음을 알고 있습니다. 그리고 나는 우리가 CurrentCulture때문에 하나 개의 문화 TimeZoneInfo를 가져올 수 없습니다 알 수있는 많은 TimeZone이스레드 당 시간대 설정 방법?

미국 같은그러나 현재의 thread에 대한 시간대에 대처하기 위해 같은 기술을 사용할 수 있습니다.

우리는 같은 것을 만들 수 있다면 아주 좋은 것 :

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

우리는 .NET 사이트에 대한 원하는 기능, 우린 아니에요 솔리드 질문 사이트에 솔리드 답변. 시간대 처리가 가장 좋은시기에는별로 중요하지 않으며 스레드 당 시간대의 복잡성 계층을 추가하면 문제가 생길뿐입니다. – Petesh

+0

@Petesh 왜 실제로 묻는 것은 아닙니다. 그것이 어떤면에서 가능한지 궁금 해서요. –

+1

시간대를위한 스레드 로컬 객체를 만드는 것을 막을 수있는 방법은 없습니다. 코드를 사용하는 것 외에는 아무것도 사용하지 않는 것입니다. .NET에서 구현 된 간단한 방법으로 ['ThreadLocal '클래스] (http://msdn.microsoft.com/en-us/library/dd642243.aspx)를 봐야합니다. – Petesh

답변

5

불행하게도, "현재"시간대의 개념은 컴퓨터의 운영 체제 설정에 연결되어 그 코드가 실행 중입니다. 표준 시간대를 변경하기위한 Win32 API가 있지만 사용하지 않는 것이 좋습니다. 그것들은 "thread-safe"하지 않을뿐만 아니라 "process-safe"도 아닙니다. 시간대 설정은 시스템에서 실행중인 모든 항목에 영향을줍니다.

그렇다면 실제로 사용 사례가 무엇인지 궁금 할 것입니다. 스레드 당 시간대를 설정하는 위치에 있다면 로컬 설정에 전혀 의존하지 않는 위치에있을 것입니다. 대신 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