C++ mktime and DST

C++ mktime and DST

本文关键字:DST and mktime C++      更新时间:2023-10-16

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

但是我有一个奇怪的问题:我在GMT中存储日期和时间,区域设置也是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/

一般算法如下:

  1. 将您的输入传递给mktime
  2. 将输出传递给gmtime
  3. 将输出传递给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的地址。