次の方法で共有


SetTimeZoneInformation 関数 (timezoneapi.h)

現在のタイム ゾーン設定を設定します。 これらの設定は、協定世界時 (UTC) から現地時刻への変換を制御します。

年から年に変更される夏時間の境界をサポートするには、 SetDynamicTimeZoneInformation 関数を使用します。

構文

BOOL SetTimeZoneInformation(
  [in] const TIME_ZONE_INFORMATION *lpTimeZoneInformation
);

パラメーター

[in] lpTimeZoneInformation

新しい設定を含む TIME_ZONE_INFORMATION 構造体へのポインター。

戻り値

関数が成功すると、戻り値は 0 以外になります。

関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

この関数を成功させるには、アプリケーションにSE_TIME_ZONE_NAME特権が必要です。 この特権は既定で無効になっています。 SetTimeZoneInformation を呼び出す前に特権を有効にしてから、SetTimeZoneInformation 呼び出し後に特権を無効にするには、AdjustTokenPrivileges 関数を使用します。 詳細については、「特別な特権を使用して実行する」を参照してください。

Windows Server 2003 および Windows XP/2000: アプリケーションには、SE_SYSTEMTIME_NAME特権が必要です。

重要

Windows Vista および Windows Server 2008 以降のすべての現在のバージョンの Windows では、SetTimeZoneInformation ではなく SetDynamicTimeZoneInformation を呼び出して、システム タイム ゾーン情報を設定します。 SetDynamicTimeZoneInformation では、Windows レジストリの動的データによって提供される標準時と夏時間に対する変更の完全な履歴がサポートされています。 アプリケーションで SetTimeZoneInformation を使用している場合、システムの動的夏時間のサポートが無効になり、"現在のタイム ゾーンが認識されません。 有効なタイム ゾーンを選択してください。"は、Windows タイム ゾーンの設定でユーザーに表示されます。

タイム ゾーンが変更されたことをエクスプローラーに通知するには、WM_SETTINGCHANGE メッセージを送信します。

UTC と現地時刻の間のすべての変換は、次の数式に基づいています。

UTC = ローカル時間 + 時差

時差とは、UTC とローカル時間との間の、分単位で表される差です。

次の例では、現在のタイム ゾーンを表示し、タイム ゾーンを 1 ゾーン西に調整します。 古いタイム ゾーン名と新しいタイム ゾーン名が表示されます。 コントロール パネルの日付と時刻を使用して変更を確認することもできます。 新しい名前は、[ 日付&時刻 ] タブに [ 現在のタイム ゾーン] として表示されます。 新しいタイム ゾーンは、[ タイム ゾーン ] タブのドロップダウン リストに表示されます。これらの変更を元に戻すには、ドロップダウン リストから古いタイム ゾーンを選択するだけです。

#define UNICODE 1
#define _UNICODE 1

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <strsafe.h>

int main()
{
   TIME_ZONE_INFORMATION tziOld, tziNew, tziTest;
   DWORD dwRet;

   // Enable the required privilege

   HANDLE hToken;
   TOKEN_PRIVILEGES tkp;

   OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken);
   LookupPrivilegeValue(NULL, SE_TIME_ZONE_NAME, &tkp.Privileges[0].Luid);
   tkp.PrivilegeCount = 1;
   tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
   AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

   // Retrieve the current time zone information

   dwRet = GetTimeZoneInformation(&tziOld);

   if(dwRet == TIME_ZONE_ID_STANDARD || dwRet == TIME_ZONE_ID_UNKNOWN)    
      wprintf(L"%s\n", tziOld.StandardName);
   else if( dwRet == TIME_ZONE_ID_DAYLIGHT )
      wprintf(L"%s\n", tziOld.DaylightName);
   else
   {
      printf("GTZI failed (%d)\n", GetLastError());
      return 0;
   }

   // Adjust the time zone information

   ZeroMemory(&tziNew, sizeof(tziNew));
   tziNew.Bias = tziOld.Bias + 60;
   StringCchCopy(tziNew.StandardName, 32, L"Test Standard Zone");
   tziNew.StandardDate.wMonth = 10;
   tziNew.StandardDate.wDayOfWeek = 0;
   tziNew.StandardDate.wDay = 5;
   tziNew.StandardDate.wHour = 2;

   StringCchCopy(tziNew.DaylightName, 32, L"Test Daylight Zone");
   tziNew.DaylightDate.wMonth = 4;
   tziNew.DaylightDate.wDayOfWeek = 0;
   tziNew.DaylightDate.wDay = 1;
   tziNew.DaylightDate.wHour = 2;
   tziNew.DaylightBias = -60;

   if( !SetTimeZoneInformation( &tziNew ) ) 
   {
      printf("STZI failed (%d)\n", GetLastError());
      return 0;
   }

   // Retrieve and display the newly set time zone information

   dwRet = GetTimeZoneInformation(&tziTest);

   if(dwRet == TIME_ZONE_ID_STANDARD || dwRet == TIME_ZONE_ID_UNKNOWN)    
      wprintf(L"%s\n", tziTest.StandardName);
   else if( dwRet == TIME_ZONE_ID_DAYLIGHT )
      wprintf(L"%s\n", tziTest.DaylightName);
   else printf("GTZI failed (%d)\n", GetLastError());

   // Disable the privilege

   tkp.Privileges[0].Attributes = 0; 
   AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0); 

   return 1;
}

要件

   
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー timezoneapi.h (Windows.h を含む)
Library Kernel32.lib
[DLL] Kernel32.dll

関連項目

GetTimeZoneInformation

SetDynamicTimeZoneInformation

TIME_ZONE_INFORMATION

時間関数