C ++ mktime和DST

时间:2014-03-21 11:33:48

标签: c++ mktime

我正在处理存储的日期和时间。我将它们以字符串格式存储在GMT文件中 (即DDMMYYYYHHMMSS)。当客户端查询时,我将此字符串转换为struct tm,然后使用mktime将其转换为秒。我这样做是为了检查无效的DateTime。我再次将秒转换为字符串格式。所有这些处理都很好,没有任何问题。

但是我有一个奇怪的问题:我在GMT中存储日期和时间,同时也使用GMT。由于白天节省了光,我的区域设置时间更改为GMT + 1。现在,如果我查询存储的日期和时间,我会减少1小时,因为mktime函数使用区域设置,即GMT + 1,将struct tm转换为秒(tm_isdst设置为 - 1 mktime自动检测夏令时等。

有任何想法如何解决这个问题?

3 个答案:

答案 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)大于零,如果夏令时无效则为零,如果信息不可用则小于零。

http://www.cplusplus.com/reference/ctime/tm/

答案 2 :(得分:1)

以下是一般算法:

  1. 将您的输入传递给mktime
  2. 将输出传递给gmtime
  3. 将输出传递给mktime
  4. 这是一个编码示例:

    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的地址。