我在处理存储日期和时间。 我将它们存储在格林尼治标准时间以字符串格式(即文件DDMMYYYYHHMMSS
)。 当客户端查询,我这个字符串转换为struct tm
,然后用它转换成秒mktime
。 我这样做是为了检查是否有无效的日期时间。 我再做秒转换为字符串格式。 所有这些处理是好的,根本没有问题。
但我有一个奇怪的问题:我用存储区域也GMT格林尼治标准时间的日期和时间。 由于日光节约的,我的语言环境的时间改为GMT + 1。 现在,如果我查询的存储日期和时间,我获得1小时少,因为mktime
函数使用的语言环境,即GMT + 1,在转换struct tm
以秒( tm_isdst
设置为-1,所以mktime
检测夏令等自动)。
任何想法如何解决这个问题呢?
使用_mkgmtime
/ timegm
为补充mktime
。
time_t mkgmtime(struct tm* tm)
{
#if defined(_WIN32)
return _mkgmtime(tm);
#elif defined(linux)
return timegm(tm);
#endif
}
在夏令时标记(tm_isdst的)大于零,如果夏令时生效,零,如果夏令时不生效,并且小于零,如果该信息不可用。
http://www.cplusplus.com/reference/ctime/tm/
这是一般的算法:
- 您通过输入
mktime
。 - 通过输出到
gmtime
。 - 通过输出到
mktime
。
这里是一个编码例:
struct tm input = Convert(input_string); // don't forget to set 'tm_isdst' here
time_t temp1 = mktime(&input);
struct tm* temp2 = gmtime(&temp1);
time_t output = mktime(temp2);
需要注意的是函数gmtime
是不是线程安全的,因为它返回的地址static struct tm
。