我正在处理存储的日期和时间。我将它们以字符串格式存储在GMT文件中
(即DDMMYYYYHHMMSS
)。当客户端查询时,我将此字符串转换为struct tm
,然后使用mktime
将其转换为秒。我这样做是为了检查无效的DateTime。我再次将秒转换为字符串格式。所有这些处理都很好,没有任何问题。
但是我有一个奇怪的问题:我在GMT中存储日期和时间,同时也使用GMT。由于白天节省了光,我的区域设置时间更改为GMT + 1。现在,如果我查询存储的日期和时间,我会减少1小时,因为mktime
函数使用区域设置,即GMT + 1,将struct tm
转换为秒(tm_isdst
设置为 - 1 mktime
自动检测夏令时等。
有任何想法如何解决这个问题?
答案 0 :(得分:6)
使用_mkgmtime
/ timegm
作为mktime
的补充。
time_t mkgmtime(struct tm* tm)
{
#if defined(_WIN32)
return _mkgmtime(tm);
#elif defined(linux)
return timegm(tm);
#endif
}
答案 1 :(得分:1)
如果夏令时生效,则夏令时标志(tm_isdst)大于零,如果夏令时无效则为零,如果信息不可用则小于零。
答案 2 :(得分:1)
以下是一般算法:
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
的地址。