【问题标题】:C++ mktime and DSTC++ mktime 和夏令时
【发布时间】:2014-04-28 18:07:03
【问题描述】:

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

但我有一个奇怪的问题:我将日期和时间存储在 GMT 中,区域设置也为 GMT。由于夏令时,我的语言环境时间更改为 GMT+1。现在,如果我查询存储的日期和时间,我会减少 1 小时,因为 mktime 函数使用区域设置,即 GMT+1,将 struct tm 转换为秒(tm_isdst 设置为 -1,所以 mktime 检测到夏令时等)。

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

【问题讨论】:

    标签: c++ mktime


    【解决方案1】:

    使用_mkgmtime/timegm 作为mktime 的补充。

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

    【讨论】:

    • 感谢您的回答,这可能会解决问题。到目前为止,mktime 已用于日期操作的所有地方,但我必须添加新功能才能将 mkgmtime 用于此特定目的。
    【解决方案2】:

    如果夏令时有效,夏令时标志 (tm_isdst) 大于零,如果夏令时无效,则为零,如果信息不可用,则小于零。

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

    【讨论】:

    • 我的程序将在世界不同地区使用,这就是为什么 tm_isdst 设置为 -1 以便 mktime 自动检测夏令时。
    【解决方案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 的地址。

    【讨论】:

      猜你喜欢
      • 2015-11-10
      • 2018-11-02
      • 2012-02-10
      • 2011-02-10
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 2013-03-18
      • 2012-10-23
      相关资源
      最近更新 更多