找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 7717|回复: 3

关于ACE_OS::timezone与date +%z不一致的问题

[复制链接]
发表于 2013-3-18 15:10:21 | 显示全部楼层 |阅读模式
环境suse11,分别通过以下方式取得时区:
1. 命令行 date +%z
2. ACE_OS::timezone()

得到的2组结果是:
1. 命令行: +0800 , ACE_OS::timezone : -28800 相当于 -0800
2. 命令行: -0400, ACE_OS::timezone : 18000 相当于 +0500(USA的Michigan州)

请问各位清楚ACE_OS::timezone的工作方式吗,请教了
发表于 2013-3-19 23:52:15 | 显示全部楼层
这种问题,其实主要的解决办法就一个:追踪源代码,看看怎么实现的就知道了。
发表于 2013-3-20 17:19:03 | 显示全部楼层
  1. /**
  2. * @file    timezone.cpp
  3. * @brief   
  4. */
  5. #include "ace/OS.h"
  6. #include <iostream>
  7. using namespace std;
  8. #include <time.h>
  9. int main(int argc, char *argv[])
  10. {
  11.     struct timeval tv;
  12.     struct timezone tz;
  13.     cout << ACE_OS::timezone() << endl;
  14.     // Unix 下 ACE_OS::timezone() 相当于下面两代码
  15.     ::gettimeofday(&tv, &tz);
  16.     cout << tz.tz_minuteswest * 60 << endl;
  17.     // 由于 POSIX 已经弃用了 <gettimeofday> 的第二个参数.
  18.     // 所以 ACE_OS::timezone() 的实现是有问题的
  19.     // 命令 date +%z 相当于下面的代码
  20.     struct tm lt;
  21.     time_t tk;
  22.     char buf[20];
  23.     lt = *::localtime(&tk);
  24.     ::strftime(buf, sizeof(buf), "%z", &lt);
  25.     cout << buf << endl;
  26.     system("date +%z");
  27.     return 0;
  28. }
复制代码

点评

非常感谢.特别是说的关于date +%z,我准备采用兄台的这种方法.仅仅修改为localtime_r. 查看源码,因为宏的关系,我发现其实是采用了::tzset(); return timezone; 只是我搞不清楚为啥时区有这么多个api.我需要采用的是i  详情 回复 发表于 2013-3-25 15:10
 楼主| 发表于 2013-3-25 15:10:01 | 显示全部楼层
mymtom 发表于 2013-3-20 17:19

非常感谢.特别是说的关于date +%z,我准备采用兄台的这种方法.仅仅修改为localtime_r.
查看源码,因为宏的关系,我发现其实是采用了::tzset();  return timezone;
只是我搞不清楚为啥时区有这么多个api.我需要采用的是iso8601,我决定使用兄台这种方法.
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-4 01:27 , Processed in 0.014053 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表