SetLocalTime/GetLocalTime 없는 동일한 경우 일광 절약 시간 조정

기술 자료 번역 기술 자료 번역
기술 자료: 234735 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

현상

날짜/시간 제어 제어판 도구에서 "자동으로 변경 내용을 일광 클럭 조절" 옵션을 선택한 상태에서 SetLocalTime() 호출 시간이 올바르게 있는 관점에서 GetLocalTime() API의 설정되지 않습니다. 테스트 프로그램 결과는 다음과 같습니다: **** 않은 일광 절약 AUTO UPDATE ****
D:\cst>obj\i386\test1
SetLocalTime:  1998/08/30 22:59:00
GetLocalTime:  1998/08/30 22:59:00
GetSystemTime: 1998/08/31 06:59:00

GetTimeZoneInformation: 
 Bias 480  Name: Pacific Standard Time  SysDate: 00/10/05 02:00:00  Bias: 0
 User_Shared_Data bias: 00000043 0e234000


SetLocalTime:  1998/12/29 22:59:00
GetLocalTime:  1998/12/29 22:59:00
GetSystemTime: 1998/12/30 06:59:00

GetTimeZoneInformation: 
 Bias 480  Name: Pacific Standard Time  SysDate: 00/10/05 02:00:00  Bias: 0
 User_Shared_Data bias: 00000043 0e234000


D:\cst>time /t 
10:59p
				
**** WITH 일광 절약 AUTO UPDATE ****
D:\cst>obj\i386\test1
SetLocalTime:  1998/08/30 22:59:00
GetLocalTime:  1998/08/30 23:59:00     <<<<<<<<<<<<<   THIS  IS OFF BY AN HOUR
GetSystemTime: 1998/08/31 06:59:00

GetTimeZoneInformation: 
 Bias 480  Name: Pacific Daylight Time  SysDate: 00/04/01 02:00:00  Bias: -60
 User_Shared_Data bias: 0000003a ac5ed800


SetLocalTime:  1998/12/29 22:59:00
GetLocalTime:  1998/12/29 21:59:00            <<<<<<<<<<<<<   THIS  IS OFF BY AN HOUR
GetSystemTime: 1998/12/30 05:59:00

GetTimeZoneInformation: 
 Bias 480  Name: Pacific Standard Time  SysDate: 00/10/05 02:00:00  Bias: 0
 User_Shared_Data bias: 00000043 0e234000


D:\cst>time /t 
 9:59p
				
테스트 프로그램을 여기에 있습니다: (또한: 파일이 첨부된 참조)
// time zone test

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <sys\timeb.h>
#include <windows.h>
#include <process.h>
#include <errno.h>
#include <process.h>


#define BIAS1 ( *((DWORD*)0x7FFe0020) )
#define BIAS2 ( *((DWORD*)0x7FFe0024) )

CHAR buf[200];   // message buffer

VOID FormatSt( SYSTEMTIME st, CHAR* buf)
{
    sprintf(buf,"%02d/%02d/%02d %02d:%02d:%02d",
        st.wYear, st.wMonth, st.wDay,
        st.wHour, st.wMinute, st.wSecond );
}

VOID PrintTZInfo()
{
    TIME_ZONE_INFORMATION tzi;
    DWORD dwSta;

    dwSta= GetTimeZoneInformation( &tzi );
   
    printf("GetTimeZoneInformation: \n ");
    switch( dwSta )
    {
        case TIME_ZONE_ID_UNKNOWN:
            printf("returned TIME_ZONE_ID_UNKNOWN\n");
            break;

        case TIME_ZONE_ID_STANDARD:
            FormatSt( tzi.StandardDate, buf );
            printf("Bias %d  Name: %S  SysDate: %s  Bias: %d\n",
                   tzi.Bias, tzi.StandardName, buf, tzi.StandardBias );
            break;

        case TIME_ZONE_ID_DAYLIGHT:
            FormatSt( tzi.DaylightDate, buf );
            printf("Bias %d  Name: %S  SysDate: %s  Bias: %d\n",
                   tzi.Bias, tzi.DaylightName, buf, tzi.DaylightBias );
            break;

        default:
            printf("returned undoced status: %d",dwSta);
            break;
    }
    printf(" User_Shared_Data bias: %08x %08x\n\n",BIAS2, BIAS1 );
}

VOID TstSetTime( int year, int mon, int day, int hour, int minute, int sec)
{
    SYSTEMTIME st,tst;
    BOOL bSta;

    st.wYear=  year;
    st.wMonth= mon;
    st.wDay=   day;
    st.wHour=  hour;
    st.wMinute= minute;
    st.wSecond= sec;

    st.wDayOfWeek= 0;
    st.wMilliseconds= 0;

    bSta= SetLocalTime( &st );

    if( bSta == FALSE )
    {
        FormatSt( st, buf);
        printf("Failed to set date/time: %s\n",buf);
    }
    else
    {
        FormatSt( st, buf);
        printf("SetLocalTime:  %s\n",buf);

        GetLocalTime( &tst );
        FormatSt( tst, buf);
        printf("GetLocalTime:  %s\n", buf);

        GetSystemTime( &tst );
        FormatSt( tst, buf );
        printf("GetSystemTime: %s\n", buf);
    }
    printf("\n");

}

VOID PrintTime( CHAR* msg )
{
    SYSTEMTIME st;

    GetLocalTime( &st );

    FormatSt( st, (CHAR*) buf );

    printf("%s %s\n", msg, buf);

}

int _cdecl  main(int argc, char** argv)
{

    // pick date in savings time

    TstSetTime( 1998, 8, 30, 22, 59, 0 );
    PrintTZInfo();

    // pick date outside of savings time

    printf("\n");
    TstSetTime( 1998, 12, 29, 22, 59, 0 );
    PrintTZInfo();

    return(0);
}

				

원인

SetLocalTime 호출할 때 이 문제가 발생합니다. 전달된 시간을 UTC 시간대 바이어스를 유효한 호출 시 사용하여 변환되며 다음 SetSystemTime 호출됩니다. 이 알고리즘은 볼 수 있는 문제를 일으키는. Windows NT이 이 방법은 첫 번째 릴리스 (Windows NT 3.1) 이후 작업한 및 변경할 수 없습니다.

이 문제는 Windows 95/98에서 다르지만 일부 프로그램을 중단하지 않고 위험을 변경할 수 없습니다. 호출자가 시간을 조정할 경우 Windows NT에서 API 두 번 의도한 결과를 얻을 수 있도록 호출해야 할 것입니다. 호출자는 호출 전에 조정하면 한 번만이 수행합니다. Windows 95/98 한 번만 호출할 수 있게 합니다.

해결 방법

이 문제를 해결하려면 SetLocalTime() 행을 두 번 호출해야 합니다. 첫 번째 호출이 올바른 DST 설정을 변경, 두 번째 호출에서는 시간을 설정합니다.

현재 상태

이것은 의도적으로 설계된 동작입니다.

속성

기술 자료: 234735 - 마지막 검토: 2007년 1월 23일 화요일 - 수정: 1.2
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Windows 2000 Server
  • Microsoft Windows NT Server 4.0 Standard Edition
키워드:?
kbmt kbbug kbpending kbprogramming KB234735 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com