SetLocalTime/GetLocalTime と夏時間を調整する場合は、

文書翻訳 文書翻訳
文書番号: 234735
すべて展開する | すべて折りたたむ

現象

日付/時刻コントロール パネルで、「夏時間の時計を自動的に調整する] オプションが選択されているときに SetLocalTime() の呼び出しが正しく GetLocalTime() API の視点から設定されません。テスト プログラムの結果は次のとおりです。**** に夏時間の貯蓄の自動更新 ****
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
				
**** と夏時間の貯蓄の自動更新 ****
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
				
テスト プログラムのとおりです (また、「添付ファイル)。
// 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);
}

				

原因

SetLocalTime が呼び出すときにこの問題が発生します。UTC のタイム ゾーンの時差に、呼び出しの時点で有効を使用して、渡された時刻に変換され、SetSystemTime が呼び出されます。このアルゴリズムが表示される現象が発生します。Windows NT こう (Windows NT 3.1) 最初のリリース以降に費やしたし、変更することはできません。

この現象は Windows 95/98 から別ですが、いくつかのプログラムを中断のリスクなしは変更できません。呼び出し元が、調整されない場合 Windows NT では、API 2 回が意図した結果を取得するために呼び出す必要があります。通話する前に、呼び出し元を調整する場合は、[1 回だけ実行します。Windows 95/98 では、1 つだけ呼び出しする必要があります。

解決方法

この問題を回避するには、SetLocalTime() の行を 2 回呼び出します。最初の呼び出しを正しい DST 設定に変更、2 番目の呼び出し時間を設定します。

状況

この動作は仕様です。

プロパティ

文書番号: 234735 - 最終更新日: 2011年7月22日 - リビジョン: 3.0
キーワード:?
kbbug kbprogramming kbpending kbmt KB234735 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:234735
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

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