2010-07-05 2 views
0

전세계 고객이 내 서버 응용 프로그램에 특정 '요청'을 보낼 수 있습니다. 이 모든 고객은 여러 다른 시간대에 있습니다.한 시간대에서 다른 시간대로 변환 (네이티브 C++)

모든 요청에 ​​대해 요청을 내부 C++ 클래스 인스턴스에 매핑해야합니다. 모든 클래스 인스턴스에는 '위치'에 대한 정보가 있으며 이는 시간대로도 표시됩니다.

모든 고객은 다른 시간대에 속하는 인스턴스와 관련된 요청을 보낼 수 있습니다. 고객이 모든 것을 '대상'인스턴스의 시간대로 변환하지 못하도록 모든 것을 하나의 시간대에서 다른 시간대로 변환해야합니다. 그러나 C++ (비 관리, 네이티브) 함수 만 로컬 시간과 GTM 사이의 시간을 변환하지만 현재 시간대가 아닌 시간대는 변환하지 않습니다.

고객에게 UTC 또는 GTM의 모든 날짜를 보내달라고 요청할 수는 있지만 시간대가 될 수있는 '인스턴스'의 시간대로 변환해야하므로 문제가 해결되지 않습니다. 세계.

또한이 작업을 수행하는 Windows 기능을 찾지 못하는 것 같습니다. 내가 찾은 것은 관리되는 .Net 클래스이다. 그러나이 클래스는 내 애플리케이션을 엄격하게 관리하지 않기를 원한다.

사용할 수 있고 (설명서에서 간과 한) Windows (XP, Vista, 7, 2003, 2008) 기능이 있습니까? 아니면 표준 시간대와 표준 시간대간에 변환 할 수있는 다른 무료 알고리즘이 있습니까? 다른?

문제를 유발하는 것은 GMT 차이가 아니라 시간대에 따라 달라지는 실제 DST 전환 순간입니다. 예 :

  • 서유럽은 4 월 1 일 전 마지막 일요일이 아닌 DST에서 DST로 변경됩니다.
  • 미국은 3 월 1 일 이후 두 번째 일요일에 비 DST에서 DST로 이동합니다.
  • 중국에는 DST가 없습니다.
  • 호주는 10 월 1 일 이후 첫 번째 일요일에 비 DST에서 DST로 이동합니다.

이 DST 전환 정보는 Windows 레지스트리의 어딘가에서 사용할 수 있습니다. 문제는이 정보를 악용하는 데 사용할 수있는 Windows 기능입니다.

+0

DST 전환은 지역의 정치적 결정입니다.모든 비용을 들이지 않고 이것을 피하고 클라이언트 컴퓨터가 UTC 변환을 로컬에서 로컬로 변환하도록합니다. –

+0

@Hans, 문제는 서버가 전 세계에 분산되어있는 창고를 관리하고 있으며 각각 개점 시간/폐쇄 시간이 있다는 것입니다. 고객에게 현지 시간을 UTC로 변환하도록 요청하는 것은 쉽지만 모든 창고 개폐 시간을 UTC로 변환해야합니다. 이렇게하려면 표준 시간대 정보가 필요합니다. – Patrick

+0

글쎄, 고객에게 물어 보지 마라. 그것을 자동으로하십시오. –

답변

2

API를 통해 다른 TimeZones에 대한 정보를 추출하는 방법을 모르겠습니다. WindowsCE 기반 제품에서 레지스트리를 쿼리하여 완료 한 것으로 보았습니다.

하는 TimeZone는

HKLM\Software\Microsoft\Windows NT\Current Version\Time Zones 

각 키는 여러 값을 포함 아래 레지스트리 키로 정의하고 있으며, & 일광 절약 오프셋에 대해 알려주는 사람은 TZI 키입니다. 이 바이너리 덩어리이며,이 구조를 나타냅니다

typedef struct 
{ 
    LONG m_nBias; 
    LONG m_nStandardBias; 
    LONG m_nDaylightBias; 
    SYSTEMTIME m_stcStandardDate; 
    SYSTEMTIME m_stcDaylightDate; 
} TZI; 

MSDN의 TIME_ZONE_INFORMATION 페이지 (http://msdn.microsoft.com/en-us/library/ms725481(v=VS.85).aspx을)를 봐 바이어스 필드, 특히 StandardDate 및 DaylightDate 필드를 해석하는 방법에 대한이 - 그들이 부드럽게 지원 학대 "4 월 마지막 토요일"과 같은 구조.

HTH

+0

감사합니다. 귀하의 링크를 통해 특정 시간대에 대해이 정보를 반환하는 GetTimeZoneInformationForYear (> = Vista SP1) Windows 기능을 발견했습니다. 문제는 :이 함수에 대한 샘플 코드를 찾지 못했고 함수 문서가이 함수에 정확하게 입력 데이터를 제공해야한다는 것을 명확히하지 않습니다. 모범이 있습니까? – Patrick

+0

@ 패트릭 - 나는 두려워하는 예제가 없습니다. 우리는 WinCE에서 우리가 옵션으로 GetTimeZoneInformationForYear()을 가지고 있지 않기 때문에 작업하고 있습니다. 그러나 나는 그것이 당신에게 많은 도움이되는지 확신하지 못합니다. 원격지 고객을위한 시간대를 얻고 싶습니다. 만약 내가 이해한다면, 임의의 해에 컴퓨터가있는 시간대가 아닙니다. – AAT

관련 문제