Bagikan melalui


Fungsi SetTimeZoneInformation (timezoneapi.h)

Menyetel setelan zona waktu saat ini. Pengaturan ini mengontrol terjemahan dari Waktu Universal Terkoordinasi (UTC) ke waktu setempat.

Untuk mendukung batas waktu musim panas yang berubah dari tahun ke tahun, gunakan fungsi SetDynamicTimeZoneInformation .

Sintaks

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

Parameter

[in] lpTimeZoneInformation

Penunjuk ke struktur TIME_ZONE_INFORMATION yang berisi pengaturan baru.

Mengembalikan nilai

Jika fungsi berhasil, nilai yang dikembalikan bukan nol.

Jika fungsi gagal, nilai yang dikembalikan adalah nol. Untuk mendapatkan informasi kesalahan yang diperluas, hubungi GetLastError.

Keterangan

Aplikasi harus memiliki hak istimewa SE_TIME_ZONE_NAME agar fungsi ini berhasil. Hak istimewa ini dinonaktifkan secara default. Gunakan fungsi AdjustTokenPrivileges untuk mengaktifkan hak istimewa sebelum memanggil SetTimeZoneInformation, lalu untuk menonaktifkan hak istimewa setelah panggilan SetTimeZoneInformation . Untuk informasi selengkapnya, lihat Menjalankan dengan Hak Istimewa.

Windows Server 2003 dan Windows XP/2000: Aplikasi harus memiliki hak istimewa SE_SYSTEMTIME_NAME.

Penting

Dimulai dengan Windows Vista dan Windows Server 2008 melalui semua versi Windows saat ini, panggil SetDynamicTimeZoneInformation alih-alih SetTimeZoneInformation untuk mengatur informasi zona waktu sistem. SetDynamicTimeZoneInformation mendukung riwayat lengkap perubahan pada waktu standar dan waktu musim panas yang disediakan oleh data dinamis di registri Windows. Jika aplikasi menggunakan SetTimeZoneInformation, dukungan waktu musim panas dinamis dinonaktifkan untuk sistem dan pesan "Zona waktu Anda saat ini tidak dikenali. Silakan pilih zona waktu yang valid." akan muncul kepada pengguna di pengaturan zona waktu Windows.

Untuk memberi tahu Explorer bahwa zona waktu telah berubah, kirim pesan WM_SETTINGCHANGE .

Semua terjemahan antara UTC dan waktu setempat didasarkan pada rumus berikut:

UTC = waktu lokal + bias

Bias adalah perbedaan, dalam menit, antara UTC dan waktu setempat.

Contoh

Contoh berikut menampilkan zona waktu saat ini, lalu menyesuaikan zona waktu satu zona barat. Nama zona waktu lama dan baru ditampilkan. Anda juga dapat memverifikasi perubahan menggunakan Tanggal dan Waktu di Panel Kontrol. Nama baru ditampilkan pada tab Tanggal&Waktu sebagai Zona Waktu Saat Ini. Zona waktu baru ditampilkan di daftar drop-down pada tab Zona Waktu . Untuk membatalkan perubahan ini, cukup pilih zona waktu lama Anda dari daftar drop-down.

#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;
}

Persyaratan

   
Klien minimum yang didukung Windows 2000 Professional [hanya aplikasi desktop]
Server minimum yang didukung Windows 2000 Server [hanya aplikasi desktop]
Target Platform Windows
Header timezoneapi.h (termasuk Windows.h)
Pustaka Kernel32.lib
DLL Kernel32.dll

Lihat juga

GetTimeZoneInformation

SetDynamicTimeZoneInformation

TIME_ZONE_INFORMATION

Fungsi Waktu