2011-01-06 4 views
6

WPF 앱을 Silverlight 4로 마이그레이션하려고합니다. WPF 앱은 Speicific 시간대의 DateTime을 다른 특정 시간의 DateTime으로 변환하기 위해 TimeZoneInfo.FindSystemTimeZoneById() 및 TimeZoneInfo.ConvertTimeFromUtc()를 사용합니다. 존.silverlight 시간대 변환

그러나 Silverlight 4에서 이러한 기능 중 하나를 찾을 수 없습니다. Silverlight는 Utrecht와 Local 간의 표준 시간대 변환을 지원하는 것으로 보입니다.

Silverlight에서 임의의 시간대에서 다른 시간대로 DateTime을 변환하는 방법이 있습니까?

답변

2

불행히도 현재로서는 표준 기능이 없습니다.

TimeZoneInfo.FindSystemTimeZoneById() 메서드의 작동 방식을 리플렉터를 사용하여 확인합니다. 그냥 s_systemTimeZones 필드의 값 중 하나를 취합니다

private static Dictionary<string, TimeZoneInfo> s_systemTimeZones 
{ 
    get 
    { 
     if (s_hiddenSystemTimeZones == null) 
     { 
      s_hiddenSystemTimeZones = new Dictionary<string, TimeZoneInfo>(); 
     } 
     return s_hiddenSystemTimeZones; 
    } 
    set 
    { 
     s_hiddenSystemTimeZones = value; 
    } 
} 

이 필드를 저장 가능한 모든 TimeZoneInfo 중-들. FindSystemTimeZoneById (id)를 호출하면 미리 채워진 사전에서 값을 가져 왔습니다. 이 사전이 초기화 될 때 및 초기화에 사용되는 값을 언제 알 수 없습니다.

가장 확실한 방법은 마이크로 소프트 \ 윈도우 NT를 \ CurrentVersion \ 시간대는 HKEY_LOCAL_MACHINE \ SOFTWARE \ 자신의 사전 사전을 생성하고 값을 입력한다 : 그러나 this thread에서 사람은 TimeZoneInfo 중이 레지스트리 값을 사용하는 것이 말했다. 이 같은 것은 :

Dictionary<string, TimeZoneInfo> dictionary = new Dictionary<string, TimeZoneInfo>(); 
TimeZoneInfo info = new TimeZoneInfo("ID", new TimeSpan(0, 1, 0, 0), "SomeCultureName", "Some Standard Time", "Some Daylight Time", null, true); 
dictionary.Add("Some time", info); 

그러나 또 다른 문제가 있습니다. TimeZoneInfo 생성자가 private입니다. 따라서 FindSystemTimeZoneById() 및 ConvertTimeFromUtc() 기능을 사용하려면 매우 처음부터 구현해야합니다. 표준 시간대를 나타내는 클래스를 만들고,이 클래스의 사전을 생성하고 채우십시오.
별로 좋은 소식이 없습니다. 그러나 나는 ... 당신이

사람이 스레드에 걸쳐 실행되는 경우
0

가 여기 내가 찾은 무엇 :) 유용 할 것입니다 희망

전체 .NET 4 TimeZoneInfo 중 용 Microsoft 참조 소스 코드 (CLR)에는 TryGetTimeZoneByRegistryKey() 메서드가 포함되어 있는데이 메서드는 레지스트리 키 HKLM\Software\Microsoft\Windows NT\CurrentVersion\Time Zones에서 표준 시간대를 가져옵니다.

신뢰할 수있는 Silverlight 응용 프로그램을 작성하는 경우 P/Invoke를 사용하여 레지스트리 조회를 수행 할 수 있습니다.

Google 앱의 경우 완전 신뢰 권한을 묻는 대화 상자를 표시하지 않으려합니다. 좀 더 검색하고 찾았습니다 Stephane Delcroix's open-source implementation - 그 링크보다 더 공식 소스가 있는지 확실하지 않습니다. Unix 표준 시간대 데이터베이스 형식 (zoneinfo)으로 작동하며 IANA에서 download 수 있습니다.

표준 시간대 데이터베이스는 상당히 크기 때문에 Silverlight 응용 프로그램을 포함 시키면 Silverlight 응용 프로그램의 크기가 커집니다. 그러나 우리는 단지 몇 시간대를 지원할 필요가있었습니다. 데이터베이스의 하위 집합을 가져 와서 Silverlight 앱에 리소스로 패키지했습니다. Stephane의 코드를 수정하여 파일 시스템보다는 리소스 스트림에서 읽도록했습니다./etc/localtime이 없으므로 모든 현지 시간 기능을 제거해야했습니다. 그러나 우리는 명명 된 표준 시간대와이 표준 시간대와 UTC간에 변환 할 수있는 기능 만 필요했습니다. 이 접근법은 정상적으로 작동하는 것 같습니다.

+0

흠. 나는 실제로 IANA 다운로드를 사용하지 않았다 - 우리는 네트워크상의 가장 가까운 리눅스 컴퓨터에서/etc/zoneinfo의 내용을 복사했다. IANA 파일은 텍스트 형식이므로 시간대 컴파일러 ("zic")를 통해 실행해야합니다. "zic"소스도 같은 IANA 페이지에 있습니다. 하지만 바이너리를 사용하려면 리눅스 컴퓨터가 있다면이 바이너리를 사용하는 것이 더 쉽습니다. –

+0

다음은 [GitHub의 버전]입니다 (https://github.com/mono/mono/tree/master/mcs/class/System.Core/System). –

1

조금 늦었지만,이 질문은 항상 MS 커뮤니티 사이트에 올려서 사람들에게 물어 보았습니다.표준 시간대 ID 조회를 수행하지 않았지만 내 SL 응용 프로그램 내에서 FromSerializedString() 메서드를 사용했습니다. 내 웹 서비스는 ToSerializedString() 데이터를 문자열 속성으로 전달하고 SL에서는 필요에 따라이 객체를 소비합니다. 나는 TimeZoneInfo 객체의 반사자를 수행했다.

https://github.com/TWhidden/DevStuff/blob/master/StackOverflow/TimeZoneInfo.cs

이 당신을 도움이되는지 확인 (또는이 게시물의 향후 독자)하지 않습니다.

재미 있고 내 문제를 해결했습니다. 나는 이것을 V3 Silverlight에 사용하고 있었기 때문에 4/5에 좋았지 만 이미 Microsoft에 의해 향상 될 수있었습니다.

업데이트 됨 2017-04-12 : PCL 라이브러리에서 이것을 사용하여 GitHub에 링크. SL을 위해 일해야한다. 그러나 우리는 MS가 몇 해 전에했던 것처럼 그것을 떨어 뜨렸다.

+1

좋았 겠지만 링크가 죽었습니다 ... –

+0

대신 Github 링크를 사용하도록 업데이트되었습니다. – TravisWhidden