Você está offline; aguardando reconexão

SetLocalTime/GetLocalTime não o mesmo se ajustar para hora de Verão

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática… erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 234735
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Sintomas
Chamar SetLocalTime() enquanto estiver seleccionada a opção "Ajustar automaticamente o relógio para alterações da hora de Verão" na ferramenta de painel de controlo data/hora não define o tempo correctamente da vista de ponto de API GetLocalTime(). Seguem-se os resultados do teste de programa: **** sem o Verão poupança 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 do Verão poupança 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				
segue-se o programa de teste: (também Consulte ficheiros anexados)
// 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);}				
Causa
Este problema ocorre quando chamada SetLocalTime. O tempo transmitido é convertido para UTC utilizando a tendência de fuso horário em vigor no da chamada e, em seguida, é denominado SetSystemTime. Este algoritmo faz com que o comportamento que está a ver. Windows NT tem funcionado, desta forma, desde a primeira versão (Windows NT 3.1) e não pode ser alterado.

Este comportamento é diferente do Windows 95/98, mas não é possível alterá-la sem o risco de quebrar alguns programas. No Windows NT, se o autor da chamada não ajusta o tempo, a API terá ser chamado duas vezes para obter os resultados pretendidos. Se o autor da chamada ajusta antes de telefonar, em seguida, irá fazê-apenas uma vez. No Windows 95/98, é necessário efectuar apenas uma chamada.
Resolução
Para contornar este problema, contacte SetLocalTime() duas vezes numa linha. A primeira chamada alterações à definição da hora de Verão correcta, a segunda chamada define o tempo.
Ponto Da Situação
Este comportamento ocorre por predefinição.

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 234735 - Última Revisão: 12/05/2015 14:54:34 - Revisão: 1.2

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

  • kbnosurvey kbarchive kbmt kbbug kbpending kbprogramming KB234735 KbMtpt
Comentários