Windows中的时区信息

时区

Windows API 没有提供直接得到特定时区信息的功能,Windows 系统中的时区信息存储在注册表中下面的位置:

HKEY_LOCAL_MACHINE
     SOFTWARE
          Microsoft
               Windows NT
                    CurrentVersion
                         Time Zones
                              time_zone_name

下面的代码演示了如何从注册表中枚举时区信息:

[cpp] view plaincopy

  1. #include <stdio.h>
  2. #include <windows.h>
  3. #define pWin32Error(dwSysErr, sMsg )
  4. typedef struct _REG_TZI_FORMAT
  5. {
  6. LONG Bias;
  7. LONG StandardBias;
  8. LONG DaylightBias;
  9. SYSTEMTIME StandardDate;
  10. SYSTEMTIME DaylightDate;
  11. } REG_TZI_FORMAT;
  12. #define REG_TIME_ZONES "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\"
  13. #define REG_TIME_ZONES_LEN (sizeof(REG_TIME_ZONES)-1)
  14. #define REG_TZ_KEY_MAXLEN (REG_TIME_ZONES_LEN + (sizeof(((TIME_ZONE_INFORMATION*)0)->StandardName)/2) -1)
  15. int GetTimeZoneInformationByName(TIME_ZONE_INFORMATION *ptzi, const char StandardName[]) {
  16. int rc;
  17. HKEY hkey_tz;
  18. DWORD dw;
  19. REG_TZI_FORMAT regtzi;
  20. char tzsubkey[REG_TZ_KEY_MAXLEN+1] = REG_TIME_ZONES;
  21. strncpy(tzsubkey + REG_TIME_ZONES_LEN, StandardName, sizeof(tzsubkey) - REG_TIME_ZONES_LEN);
  22. if (tzsubkey[sizeof(tzsubkey)-1] != 0) {
  23. fprintf(stderr, "timezone name too long\n");
  24. return -1;
  25. }
  26. if (ERROR_SUCCESS != (dw = RegOpenKey(HKEY_LOCAL_MACHINE, tzsubkey, &hkey_tz))) {
  27. fprintf(stderr, "failed to open: HKEY_LOCAL_MACHINE\\%s\n", tzsubkey);
  28. pWin32Error(dw, "RegOpenKey() failed");
  29. return -1;
  30. }
  31. rc = 0;
  32. #define X(param, type, var) \
  33. do if ((dw = sizeof(var)), (ERROR_SUCCESS != (dw = RegGetValueW(hkey_tz, NULL, param, type, NULL, &var, &dw)))) { \
  34. fprintf(stderr, "failed to read: HKEY_LOCAL_MACHINE\\%s\\%S\n", tzsubkey, param); \
  35. pWin32Error(dw, "RegGetValue() failed"); \
  36. rc = -1; \
  37. goto ennd; \
  38. } while(0)
  39. X(L"TZI", RRF_RT_REG_BINARY, regtzi);
  40. X(L"Std", RRF_RT_REG_SZ, ptzi->StandardName);
  41. X(L"Dlt", RRF_RT_REG_SZ, ptzi->DaylightName);
  42. #undef X
  43. ptzi->Bias = regtzi.Bias;
  44. ptzi->DaylightBias = regtzi.DaylightBias;
  45. ptzi->DaylightDate = regtzi.DaylightDate;
  46. ptzi->StandardBias = regtzi.StandardBias;
  47. ptzi->StandardDate = regtzi.StandardDate;
  48. ennd:
  49. RegCloseKey(hkey_tz);
  50. return rc;
  51. }
  52. #define ZONE "Russian Standard Time"
  53. int main(int argc, char* argv[])
  54. {
  55. DWORD dw;
  56. TIME_ZONE_INFORMATION tzi;
  57. dw = GetTimeZoneInformationByName(&tzi, ZONE);
  58. if (dw != 0) return 1;
  59. SYSTEMTIME lt;
  60. SYSTEMTIME ut = {
  61. 2000, /*WORD wYear;*/
  62. 1, /*WORD wMonth;*/
  63. 0, /*WORD wDayOfWeek;*/
  64. 1, /*WORD wDay;*/
  65. 12, /*WORD wHour;*/
  66. 0, /*WORD wMinute;*/
  67. 0, /*WORD wSecond;*/
  68. 0 /*WORD wMilliseconds;*/
  69. };
  70. SystemTimeToTzSpecificLocalTime(&tzi, &ut, <);
  71. printf("%d-%02d-%02d %02d:%02d:%02d UTC\n", ut.wYear, ut.wMonth, ut.wDay, ut.wHour, ut.wMinute, ut.wSecond);
  72. printf("=\n");
  73. printf("%d-%02d-%02d %02d:%02d:%02d Europe/Moscow\n", lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute, lt.wSecond);
  74. return 0;
  75. }

Windows中的时区信息,布布扣,bubuko.com

时间: 2024-10-16 15:41:27

Windows中的时区信息的相关文章

Windows中使用MySQL 查看数据库信息(四)

一.查看MySQL中的所有数据库 show databases; 二.查看当前正在使用的数据库 select database(); 三.查看当前数据库中的所有表 show tables; 四.查看表结构 describe employees; 其中employees为表名 五.显示创建表语句 show create table 表名; 六.查看表的索引信息 select index from employees; 其中employees为表名 七.查看当前连接最后一次插入到表中的标识(已插入)

用批处理在windows中导出/导入无线网络信息,复制保存为bat即可

@echo offtitle 在windows中导出/导入无线网络信息:Beginecho ========================echo 请选择操作:echo 1 查看可用的无线网络echo 2 导出无线网络配置echo 3 导入无线网络配置echo 0 退出echo ========================set /p choice=选择:if %choice%==1 goto ListWifiif %choice%==2 goto ExportWifiif %choice

Centos开机自动挂载windows中的ntfs磁盘

装了windows和centos双系统后,发现在centos中无法进入windows中的磁盘,更不要说查看磁盘里的文件了! 原来默认情况下,centos不支持Widows NTFS硬盘分区读写,要想把NTFS格式的磁盘挂载到CentOS 下面需要安装第三方软件ntfs-3g.那么如何实现挂载并开机自动挂载呢? 一.下载ntfs-3g 源码包进行编译安装 下载地址:http://down1.chinaunix.net/distfiles/ntfs-3g-1.2918.tgz 1.安装编译工具 yu

Ubuntu下访问Windows中Postgresql

因为项目的原因,需要将Ubuntu中的一些信息记录到Windows中的Postgresql数据库中,查看网上信息,最后成功了,特地记录以下,需要以下步骤: (1)在Windows中Postgresql目录下找到pg_hba.conf文件,并做修改. 在此文件中添加一行,格式参考下面七种: local      database  user  auth-method  [auth-option] host       database  user  CIDR-address  auth-metho

[C语言](二)01 获取Windows图形构件大小信息

SYSMETS.c #include <windows.h> #include "SYSMETS.H"//自定义的单元,所以用"",不是用<> //消息循环处理函数,Windows回调函数 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //Windows程序的入口函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevIn

windows中查看开机时间

windows中查看开机时间 在windows下可以使用systeminfo命令来查看. 下面是网站摘录的关于windows启动了多长时间的内容 1. windows系统可以查看从开机到现在共运行了多长时间,这个功能比较实用,比如我们为了测试系统的稳定性或者由于其他原因,想要知道自己的Windows 操作系统到底运行了多长时间,不必借助专门的工具软件进行查看,操作系统本身就可以做到,下面来看看具体的方法吧: 在Windows 98中:单击“开始→程序→附件→系统工具→系统信息”命令,在“系统信息

解决嵌入式Linux中的时区问题

如果说让我做上层软件的工作,我做起来可以得心应手,但是让我做平台方面的工作(系统问题解决.驱动编写.软件移植等工作),确实不熟悉.所以很多问题都是摸着石头过河,没有经验.许多问题在有经验的朋友那里是小菜一碟,而放在我面前总是如遇大山.不免被嘲笑为"弱鸡"- 最近我在做基于 Realtek 芯片RTL8196E的家庭网关的研发工作.Realtek提供了一个Linux的SDK开发环境.由于硬件上没有RTC,所以其中Linux的系统(下面简称为RTLinux)时钟是不正确的.需要时间同步.这

在Windows中实现Java调用DLL(转载)

本文提供调用本地 C 代码的 Java 代码示例,包括传递和返回某些常用的数据类型.本地方法包含在特定于平台的可执行文件中.就本文中的示例而言,本地方法包含在 Windows 32 位动态链接库 (DLL) 中. 不过我要提醒您,对 Java 外部的调用通常不能移植到其他平台上,在 applet 中还可能引发安全异常.实现本地代码将使您的 Java 应用程序无法通过 100% 纯 Java 测试.但是,如果必须执行本地调用,则要考虑几个准则: 将您的所有本地方法都封装在单个类中,这个类调用单个

第二十三篇:Windows中的ACPI

一直不太清楚ACPI驱动在WINDOWS中的作用. 甚至不了解ACPI协议的作用. 于是, 随便翻了下"格蠹汇编"中的第24章, 如何跟踪ACPI代码, 算是对ACPI有了一个初步性的了解. ACPI向OS报告硬件信息, 而OS通过ACPI控制硬件. ACPI就是OS与硬件/固件之间的一个标准接口协议. ACPI通过ASL(ACPI SOURCE LANGUAGE)来描述系统硬件的属性与方法, ASL最终会被编译为AML(ACPI MACHINE LANGUAGE)的字节码(BYTEC