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

HKEY_LOCAL_MACHINE
     SOFTWARE
          Microsoft
               Windows NT
                    CurrentVersion
                         Time Zones
                              time_zone_name

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

  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中的时区信息的更多相关文章

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

    @echo offtitle 在windows中导出/导入无线网络信息 :Beginecho ========================echo 请选择操作:echo 1 查看可用的无线网络ec ...

  2. ISO日期格式标准,浏览器到服务器到mysql中的时区

    时区简单理解 https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA 上面的链接是时区的wiki说明,下面说说我记住的部分: GMT时区是格林威治标准时间,我 ...

  3. windows中查看开机时间

    windows中查看开机时间     在windows下可以使用systeminfo命令来查看. 下面是网站摘录的关于windows启动了多长时间的内容 1. windows系统可以查看从开机到现在共 ...

  4. 删除项目中的.svn信息

    有时候我们新开发一个项目时,会将以前的项目从svn上down下来,然后复制一份.这样就会有个问题,项目中的svn信息就会一直存在.下面介绍删除方法: 1.新建一个.txt的文档.然后将下面代码粘贴到文 ...

  5. windows不能显示此连接属性。windows management instrumentation (WMI) 信息可能损坏

    Windows Management Instrumentation (WMI)信息可能损坏错误修复 在 查看“本地连接”的属性,并切换到“高级”选项卡后,提示:“Windows不能显示此连接的属性. ...

  6. 怎样把windows中安装的程序列出来?

    症状/问题我怎样把windows中安装的程序信息输出到一个文本文件中?解决方法使用 windows 操作系统中的命令:wmic就可以做到.下面的命令就可以把系统中安装的程序都输出到文件ProgramL ...

  7. 如何在windows中编写R程序包(转载)

    网上有不少R包的编译过程介绍,挑选了一篇比较详细的,做了稍许修改后转载至此,与大家分享 如何在windows中编写R程序包 created by helixcn modified by binaryf ...

  8. Linux命令:traceroute(windows中为tracert)

    通过traceroute 我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径.当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不 ...

  9. [转]在Windows中配置Rsync同步

    在Windows中配置Rsync同步 Rsync是一款不错的文件免费同步软件,可以镜像保存整个目录树和文件系统,同 时保持原来文件的权限.时间.软硬链接.第一次同步时 rsync 会复制全部内容,下次 ...

随机推荐

  1. Knockout 实例

    定义见:http://baike.baidu.com/item/Knockout/18611883#viewPageContent 此处仅列举一个小例子 <p> <select da ...

  2. 【百度编辑器ueditor】工具,如何去掉百度编辑器 ueditor 元素路径、字数统计等

    去掉如下截图: 在百度编辑器 ueditor 根目录下: ueditor.config.js 文件中 搜索并将参数elementPathEnabled设置成false即可 常用功能开关如下: ,ele ...

  3. GC策略

           JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(ge ...

  4. 梦想iOS版CAD控件2018.11.07更新

    下载地址: http://www.mxdraw.com/ndetail_10110.html 1.  增加iOS上的CAD绘图接口和使用例子 2.  增加动态交互使用例子 3.  把Android上改 ...

  5. maven引入的包无法使用 解决方法

    如果正常引入后在依赖中能够找到包,但是打不开 1.有可能是包下载不完整 把maven下载源由国外转成阿里镜像源找到 maven 的配置文件: settings.xml 文件: <mirror&g ...

  6. Reading Lists

    * Non-academic 1. Slowing Down to the Speed of Life, by Richard Carlson and Joseph Bailey.2. Your Mo ...

  7. Codeforces 989C - A Mist of Florescence

    传送门:http://codeforces.com/contest/989/problem/C 这是一个构造问题. 构造一张网格,网格中的字符为’A’.’B’.’C’.’D’,并且其连通块的个数分别为 ...

  8. 【Codeforces 600C】Make Palindrome

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 计算出来每个字母出现的次数. 把字典序大的奇数出现次数的字母换成字典序小的奇数出现次数的字母贪心即可. 注意只有一个字母的情况 然后贪心地把字 ...

  9. [luoguP2701] [USACO5.3]巨大的牛棚Big Barn(DP)

    传送门 经典问题. 找出最大的不包含 1 的正方形. f[i][j] 表示 以 (i,j) 结尾的最大的不包含 1 的正方形 f[i][j] = min(f[i - 1][j], f[i][j - 1 ...

  10. noip模拟赛 whzzt-Warmth

    分析:这道题难度和天天爱跑步差不了多少啊......裸的暴力只有10分,最好大的还是那个5%的数据,不过这也才15分,比天天爱跑步的暴力分不知道少到哪里去了. 正解是dp,毕竟要求方案数嘛,但是这个d ...