使用 mktime 计算时间不正确以获得 UTC+8
Incorrect time calculation with mktime to get UTC+8
我想获取香港现在的时间(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 的时间。怎么了?
有没有比这个拼凑更多的elegant/reliable获取UTC+8的方法?
将 TZ
环境变量更改为所需时区后,您可以使用 localtime
:
#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
,这是香港的时区。
In POSIX systems, a user can specify the time zone by means of the TZ
environment variable.
请注意,操作 TZ
变量的更标准方法是使用函数 int setenv (const char *name, const char *value, int replace)
,但此示例中未定义它,因此我使用了替代方法。
您可以阅读有关 TZ 环境变量的更多信息 here
我想获取香港现在的时间(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 的时间。怎么了?
有没有比这个拼凑更多的elegant/reliable获取UTC+8的方法?
将 TZ
环境变量更改为所需时区后,您可以使用 localtime
:
#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
,这是香港的时区。
In POSIX systems, a user can specify the time zone by means of the TZ environment variable.
请注意,操作 TZ
变量的更标准方法是使用函数 int setenv (const char *name, const char *value, int replace)
,但此示例中未定义它,因此我使用了替代方法。
您可以阅读有关 TZ 环境变量的更多信息 here