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

Překlady článku Překlady článku
ID článku: 234735 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

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\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 letní úspory 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
				
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 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);
}

				

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í aktualizace: 23. ledna 2007 - Revize: 1.2
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Windows 2000 Server
  • Microsoft Windows NT Server 4.0 Standard Edition
Klíčová slova: 
kbmt kbbug kbpending kbprogramming KB234735 KbMtcs
Strojově přeložený článek
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

Dejte nám zpětnou vazbu

 

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