SetLocalTime/GetLocalTime není stejně Pokud nastavení pro letní čas

Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.

Projděte si také anglickou verzi článku:234735
Tento článek byl archivován. Je nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.
Příznaky
Volání SetLocalTime() se zapnutým možnost "Automaticky posunout hodiny při přechodu na letní čas a" v nástroji časových Ovládací panely nenastaví čas správně z hlediska GetLocalTime() API. Zde jsou výsledky z testovacího programu: **** bez denního světla úspory AUTO UPDATE ****
D:\cst>obj\i386\test1SetLocalTime:  1998/08/30 22:59:00GetLocalTime:  1998/08/30 22:59:00GetSystemTime: 1998/08/31 06:59:00GetTimeZoneInformation:  Bias 480  Name: Pacific Standard Time  SysDate: 00/10/05 02:00:00  Bias: 0 User_Shared_Data bias: 00000043 0e234000SetLocalTime:  1998/12/29 22:59:00GetLocalTime:  1998/12/29 22:59:00GetSystemTime: 1998/12/30 06:59:00GetTimeZoneInformation:  Bias 480  Name: Pacific Standard Time  SysDate: 00/10/05 02:00:00  Bias: 0 User_Shared_Data bias: 00000043 0e234000D:\cst>time /t 10:59p				
**** WITH letní úspory AUTO UPDATE ****
D:\cst>obj\i386\test1SetLocalTime:  1998/08/30 22:59:00GetLocalTime:  1998/08/30 23:59:00     <<<<<<<<<<<<<   THIS  IS OFF BY AN HOURGetSystemTime: 1998/08/31 06:59:00GetTimeZoneInformation:  Bias 480  Name: Pacific Daylight Time  SysDate: 00/04/01 02:00:00  Bias: -60 User_Shared_Data bias: 0000003a ac5ed800SetLocalTime:  1998/12/29 22:59:00GetLocalTime:  1998/12/29 21:59:00            <<<<<<<<<<<<<   THIS  IS OFF BY AN HOURGetSystemTime: 1998/12/30 05:59:00GetTimeZoneInformation:  Bias 480  Name: Pacific Standard Time  SysDate: 00/10/05 02:00:00  Bias: 0 User_Shared_Data bias: 00000043 0e234000D:\cst>time /t  9:59p				
zde je testovací program: (viz také připojit soubory)
// 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 bufferVOID 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);}				
Příčina
K tomuto problému dochází při volání SetLocalTime. Předané času je převeden na UTC pomocí zkreslení timezone v platnosti v době volání a poté se nazývá SetSystemTime. Tento algoritmus způsobuje chování, které prohlížíte. Windows NT pracoval tímto způsobem od jeho prvního vydání (Windows NT 3.1) a nelze jej změnit.

Toto chování je odlišné od systému Windows 95/98, ale společnost Microsoft nemůže změnit bez rizika porušení některé programy. V systému Windows NT Pokud volající neupraví času, rozhraní API bude muset být volán dvakrát získání požadovaných výsledků. Pokud volající upraví před volací, bude to pouze jednou. V systémech Windows 95 a Windows 98 musí být pouze jedno volání.
Řešení
Chcete-li tento problém vyřešit, zavolat SetLocalTime() dvakrát za sebou. První volání změní na správné nastavení letního času, druhé volání nastaví čas.
Prohlášení
Toto chování je záměrné.

Vlastnosti

ID článku: 234735 - Poslední kontrola: 12/05/2015 14:54:27 - Revize: 1.2

Microsoft Windows 2000 Server, Microsoft Windows NT Server 4.0 Standard Edition

  • kbnosurvey kbarchive kbmt kbbug kbpending kbprogramming KB234735 KbMtcs
Váš názor