-->

C ++ mktime和DST(C++ mktime and DST)

2019-10-19 15:45发布

我在处理存储日期和时间。 我将它们存储在格林尼治标准时间以字符串格式(即文件DDMMYYYYHHMMSS )。 当客户端查询,我这个字符串转换为struct tm ,然后用它转换成秒mktime 。 我这样做是为了检查是否有无效的日期时间。 我再做秒转换为字符串格式。 所有这些处理是好的,根本没有问题。

但我有一个奇怪的问题:我用存储区域也GMT格林尼治标准时间的日期和时间。 由于日光节约的,我的语言环境的时间改为GMT + 1。 现在,如果我查询的存储日期和时间,我获得1小时少,因为mktime函数使用的语言环境,即GMT + 1,在转换struct tm以秒( tm_isdst设置为-1,所以mktime检测夏令等自动)。

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

Answer 1:

使用_mkgmtime / timegm为补充mktime

time_t mkgmtime(struct tm* tm)
{
#if defined(_WIN32)
   return _mkgmtime(tm);
#elif defined(linux)
   return timegm(tm);
#endif
}


Answer 2:

在夏令时标记(tm_isdst的)大于零,如果夏令时生效,零,如果夏令时不生效,并且小于零,如果该信息不可用。

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



Answer 3:

这是一般的算法:

  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



文章来源: C++ mktime and DST
标签: c++ mktime