使用mktime获取UTC + 8的时间计算不正确

时间:2015-07-02 03:12:54

标签: c++ visual-studio-2012 ctime

我想获取当前时间在香港(UTC + 8),当地时间是UTC-5。

在VS2012中使用并运行以下命令:

#pragma warning(disable : 4996)
char buffer[10];
time_t rawtime;
time(&rawtime);
strftime(buffer, 10, "%H:%M:%S", localtime(&rawtime));
cout << "LocalTime=" << buffer << endl;
strftime(buffer, 10, "%H:%M:%S", gmtime(&rawtime));
cout << "GMTime=" << buffer << endl;
tm* r = gmtime(&rawtime);
r->tm_hour += 8; // Hong Kong time
mktime(r); // Normalize the struct
strftime(buffer, 10, "%H:%M:%S", r);
cout << "HongKongTime=" << buffer << endl;

产生以下输出:

LocalTime=22:51:47
GMTime=02:51:47
HongKongTime=11:51:47

所以它正确地计算UTC,但是然后增加8小时实际上产生的时间是UTC +9 。出了什么问题?

有没有比这个kludge更优雅/可靠的获得UTC + 8的方式?

1 个答案:

答案 0 :(得分:1)

localtime环境变量更改为所需的时区后,您可以使用TZ

#include <iostream>
#include <stdlib.h>
#include <time.h>

int main(){

    _putenv_s( "TZ", "GMT-08:00" );

    time_t mytime = time( NULL );
    struct tm* mytm = localtime( &mytime );

    std::cout << "Current local time and date: " << asctime(mytm);
    return 0;
}

对象mytime将作为函数time()的结果接收自00:00 hours, Jan 1, 1970 UTC以来的秒数,这是当前的Unix时间戳。 localtime()将使用mytime指向的值来填充tm结构,其中的值代表相应的时间,以本地时区表示。

默认情况下,localtime()使用的时区通常是您计算机中使用的时区。但是,您可以使用_putenv_s()函数对其进行更改,我在其中操纵了TZ变量,并为其添加了新的定义GMT-08:00,这是香港的时区。

  

在POSIX系统中,用户可以通过TZ指定时区   环境变量。

请注意,操作TZ变量的更标准方法是使用函数int setenv (const char *name, const char *value, int replace),但在此示例中未对其进行定义,因此我使用了替代方法。

您可以阅读有关TZ环境变量here

的更多信息