落单de雄狮 发表于 2013-3-18 15:10:21

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

环境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的工作方式吗,请教了

winston 发表于 2013-3-19 23:52:15

这种问题,其实主要的解决办法就一个:追踪源代码,看看怎么实现的就知道了。

mymtom 发表于 2013-3-20 17:19:03

/**
* @file    timezone.cpp
* @brief   
*/

#include "ace/OS.h"

#include <iostream>
using namespace std;

#include <time.h>

int main(int argc, char *argv[])
{
    struct timeval tv;
    struct timezone tz;

    cout << ACE_OS::timezone() << endl;

    // Unix 下 ACE_OS::timezone() 相当于下面两代码
    ::gettimeofday(&tv, &tz);
    cout << tz.tz_minuteswest * 60 << endl;

    // 由于 POSIX 已经弃用了 <gettimeofday> 的第二个参数.
    // 所以 ACE_OS::timezone() 的实现是有问题的

    // 命令 date +%z 相当于下面的代码
    struct tm lt;
    time_t tk;
    char buf;
    lt = *::localtime(&tk);
    ::strftime(buf, sizeof(buf), "%z", &lt);

    cout << buf << endl;

    system("date +%z");
    return 0;
}

落单de雄狮 发表于 2013-3-25 15:10:01

mymtom 发表于 2013-3-20 17:19 static/image/common/back.gif


非常感谢.特别是说的关于date +%z,我准备采用兄台的这种方法.仅仅修改为localtime_r.
查看源码,因为宏的关系,我发现其实是采用了::tzset();return timezone;
只是我搞不清楚为啥时区有这么多个api.我需要采用的是iso8601,我决定使用兄台这种方法.
页: [1]
查看完整版本: 关于ACE_OS::timezone与date +%z不一致的问题