Vous êtes actuellement hors ligne, en attente de reconnexion à Internet.

SetLocalTime/GetLocalTime pas la même si l'ajustement de l'heure d'été

IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d’articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d’avoir accès, dans votre propre langue, à l’ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s’exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s’efforce aussi continuellement de faire évoluer son système de traduction automatique.

La version anglaise de cet article est la suivante: 234735
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Symptômes
Appel SetLocalTime() tandis que l'option « Ajuster l'horloge pour l'enregistrement des modifications d'heure d'été » est sélectionnée dans l'outil date/heure le Panneau de configuration ne définit pas le temps correctement du point de vue de l'API GetLocalTime(). Voici les résultats de programme de test: **** sans DAYLIGHT économies 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				
**** avec DAYLIGHT économies 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				
ici est le programme de test: (également voir joint fichiers)
// 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);}				
Cause
Ce problème se produit lorsque vous appelez SetLocalTime. Le temps passé est convertie en UTC utilisant le décalage de fuseau horaire en vigueur au moment de l'appel de, et ensuite SetSystemTime est appelée. Cet algorithme provoque le comportement que vous voyez. Windows NT a travaillé ainsi depuis sa première version (Windows NT 3.1) et ne peut pas être modifié.

Ce comportement est différent d'un ordinateur Windows 95/98, mais nous ne peut pas modifier sans risquer de rompre certains programmes. Dans Windows NT, si l'appelant n'ajuste pas le temps, l'API auront à appeler deux fois pour obtenir les résultats prévus. Si l'appelant ajuste avant d'appeler, une seule fois va faire. Sous Windows 95/98, qu'un appel doit être effectuée.
Résolution
Pour contourner ce problème, appelez SetLocalTime() deux fois dans une ligne. Le premier appel vous applique le paramètre d'heure D'ÉTÉ correct, le second appel définit l'heure.
Statut
Ce comportement est voulu par la conception même du produit.

Avertissement : Cet article a été traduit automatiquement.

Propriétés

ID d'article : 234735 - Dernière mise à jour : 12/05/2015 14:54:30 - Révision : 1.2

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

  • kbnosurvey kbarchive kbmt kbbug kbpending kbprogramming KB234735 KbMtfr
Commentaires