2012-08-24 2 views
3

: 그들은 사용자가 Windows 제어판에서 시간대를 선택하는 경우에 나타나는 (시간대 이름의 목록을 가져옵니다얻기 윈도우 시간대 정보 (C++/MFC) I가 시도하고

  1. 예 : "(UTC-08 : 00) 태평양 표준시 (미국 & 캐나다)").

나는 잘 작동하는 레지스트리의 "CurrentVersion \ Time Zones"섹션을 읽어서 그 일을합니다.

  1. 현재 선택된 시간대를 문자열로 가져옵니다.

GetTimeZoneInformation()을 사용하여 현재 표준 시간대를 가져올 수 있지만 이름이 레지스트리의 "CurrentVersion \ Time Zones"섹션에서 검색 한 표준 시간대 목록과 일치하지 않습니다. 예를 들어 태평양 표준시는 표준 시간대 목록에서 "(UTC-08 : 00) 태평양 표준시 (US & 캐나다)"로 표시되지만 GetTimeZoneInformation()에는 "태평양 표준시"및 "태평양 일광 절약 시간"이라는 문자열이 포함됩니다. "CurrentVersion \ Time Zones"이름에 해당하는 이름을 찾아서 목록에서 선택할 수 있어야합니다.

  1. 문자열 이름을 기준으로 UTC와 다른 표준 시간대의 현재 오프셋 (분)을 가져옵니다.

timeZoneInformation.Bias에서 UTC로부터 오프셋을 검색 할 수 있지만 현재 선택된 시간대에만 적용됩니다. 실제로 (UC-07 : 00) 산지 표준시 (미국 & 캐나다)의 레지스트리에 나열된대로 "일광 절약 시간제"를 알고 있어야합니다.

감사합니다. !

+0

Dunno 내 번호가 매겨진 목록이 1., 1., 1로 끝나는 이유는 무엇입니까? –

답변

1
TimeZoneInfo.Bias 

TIME_ZONE_INFORMATION 구조 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx

SetTimeZoneInformation 기능 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms724944(v=vs.85).aspx

// Get the local system time. 
SYSTEMTIME LocalTime = { 0 }; 
GetSystemTime(&LocalTime); 

// Get the timezone info. 
TIME_ZONE_INFORMATION TimeZoneInfo; 
GetTimeZoneInformation(&TimeZoneInfo); 

// Convert local time to UTC. 
SYSTEMTIME GmtTime = { 0 }; 
TzSpecificLocalTimeToSystemTime(&TimeZoneInfo, 
           &LocalTime, 
           &GmtTime); 

// GMT = LocalTime + TimeZoneInfo.Bias 
// TimeZoneInfo.Bias is the difference between local time 
// and GMT in minutes. 

// Local time expressed in terms of GMT bias. 
float TimeZoneDifference = -(float(TimeZoneInfo.Bias)/60); 
CString csLocalTimeInGmt; 
csLocalTimeInGmt.Format(_T("%ld:%ld:%ld + %2.1f Hrs"), 
         GmtTime.wHour, 
         GmtTime.wMinute, 
         GmtTime.wSecond, 
         TimeZoneDifference); 

TimeZoneInfo 중 클래스 - http://msdn.microsoft.com/en-us/library/bb396389 결정 일광 절약 시간 - http://www.metatrader4.com/forum/2155 Microsoft는 다른 영역에서 원하는 문자열을 넣어 선택

+0

Null 감사하지만 이미 TIME_ZONE_INFORMATION 구조를 사용하고 있습니다. GetTimeZoneInformation()을 통해 현재 시간대. 그리고 당신의 예제는 내가 이미 할 수있는 언급 한 현재 시간의 오프셋을 얻는 방법을 보여줍니다. 현재 설정되어있는 시간대가 아닌 다른 시간대에서 오프셋을 가져 오려고합니다. –

+0

[GetSystemTime] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms724390.aspx) * "[r]은 현재 시스템 날짜와 시간을 나타냅니다. 시스템 시간은 Coordinated Universal 시간 (UTC). "* 따라서 제안 된 답변의 첫 부분은 잘못되었으며, 두 번째 부분은 OP가 이미 수행하고있는 부분을 다시 반복합니다. 또한 TZ 바이어스를 나타 내기 위해 손실 된 데이터 유형을 선택하는 것과 마찬가지로 잘못하고 있습니다. 미안, -1이야. – IInspectable

3

, 일부 문자열을 검색 할 수 사소한 비입니다. 그러나 질문의 ​​일부는 이미 가지고있는 정보로 대답 할 수 있습니다.

CurrentVersion \ Time Zones 예는 영역의 이름입니다. 키는 원하는 부분의 값입니다.

재 : "(UTC-08 : 00) 태평양 표준시 (미국 & 캐나다)"

이 당신이 가지고있는 영역 이름 아래 레지스트리 값 "디스플레이"에 있습니다.

리소스 DLL에 "MUI_Display", "MUI_Std"및 "MUI_Dlt"값으로 지정된 문자열이 더 있습니다. 일반적으로 "@tzres와 같습니다.DLL, -220 "

당신이 메모리에 해당 리소스 DLL을로드하고 유니 코드 문자열로 그 특정 리소스를 가져해야합니다 이러한 문자열을 얻으려면

재 :.. 분 오프셋 어떤 시간대

.

은 또한 당신이 가지고있는 레지스트리 키의 내부 (시간대 이름) "TZI"라는 값 이는 (은 MSDN에 따라) 진 덩어리 인은 다음과 같습니다

typedef struct _REG_TZI_FORMAT 
{ 
    LONG Bias; 
    LONG StandardBias; 
    LONG DaylightBias; 
    SYSTEMTIME StandardDate; 
    SYSTEMTIME DaylightDate; 
} REG_TZI_FORMAT; 
식 UTC = 해당 날짜에 따라 로컬의 + theBiastheBias이다 어느 바이어스 + StandardBias 또는 바이어스 + DaylightBias를 사용하여 다양한 BIAS 분에

. 두 SYSTEMTIME 값은 전환 날짜를 설명합니다.

+0

Jesse에게 감사하지만 2012 년 내 게시물에 답장하는 것을 알고 계신지 궁금합니다. 나는이 스레드를 찾은 다른 사람들에게 여전히 도움이된다고 생각합니다. –

+1

@SteveA - :) 예, 사실, 저는 질문의 나이를 알고 있었고 (저의 의견으로는 부족했습니다) 이전의 대답을 알고있었습니다. 나는 또한 귀하의 의견의 나이를 알고 있습니다. 그러나 StackOverflow/StackExchange는이 코멘트를 아직 다루지 않은 이메일을 보냈습니다. 그래서 ...-D –