SetLocalTime/GetLocalTime не соответствует коррекции для летнего времени

ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.

Эта статья на английском языке:234735
Эта статья помещена в архив. Она предлагается "как есть" и обновляться не будет.
Проблема
Вызов SetLocalTime(), когда выбран параметр «Автоматически часах для летнего изменений» средства панели управления Дата и время заданы время неправильно с точки зрения GetLocalTime() API.Ниже приведены результаты тестирования программы.**** БЕЗ ЛЕТНЕГО ЭКОНОМИЯ АВТОМАТИЧЕСКОГО ОБНОВЛЕНИЯ ****
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				
**** С ЛЕТНЕГО ЭКОНОМИЯ АВТОМАТИЧЕСКОГО ОБНОВЛЕНИЯ ****
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				
Вот программа тестирования: (также см. вложенных файлов)
// 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);}				
Причина
Эта проблема возникает при вызове SetLocalTime. Переданных время преобразуется в формат UTC, используя смещения часового пояса в силу во время вызова, а затем называется SetSystemTime. Этот алгоритм приводит к поведению, будут видны. Windows NT работал таким образом, с момента первого выпуска (Windows NT 3.1) и не может быть изменен.

Это поведение отличается от Windows 95 или Windows 98, но его нельзя изменить без риска нарушения работы некоторых программ.В Windows NT Если вызывающий объект не корректировка времени, API потребуется вызывается дважды для получения желаемых результатов. Если вызывающий объект настраивает перед вызовом, будет выполнять только один раз.В Windows 95 и Windows 98 необходимо сделать только один вызов.
Решение
Чтобы обойти эту проблему, вызовите SetLocalTime() два раза подряд. При первом вызове изменяется на правильную настройку летнего времени, второй вызов задает интервал времени.
Статус
Данное поведение является особенностью.

Внимание! Эта статья переведена автоматически

Свойства

Номер статьи: 234735 — последний просмотр: 12/05/2015 14:54:35 — редакция: 4.0

операционная система Microsoft Windows 2000 Server, Microsoft Windows NT Server 4.0 Standard Edition

  • kbnosurvey kbarchive kbbug kbpending kbprogramming kbmt KB234735 KbMtru
Отзывы и предложения