c++ - mktime() 给出的结果与 Howard Hinnant 的日期库(基于 std::chrono)不同

标签 c++ date c++-chrono mktime

我正在使用 Howard Hinnant 的日期 C++ 库 ( https://howardhinnant.github.io/date/date.html ),但我在使用它时遇到了一些困惑。下面是一个程序,我使用该库来打印 2017 年 11 月第 3 个星期五的年月日。 date::year_month_weekday 类与 date::sys_days( 一起使用时) ),显示正确的日期(2017 年 11 月 17 日),但是当我使用 std::chrono::system_clock::to_time_t 将其转换为 struct tm 时,这个tm中存储的结果变成了2017年11月16日。我测试了其他情况,似乎struct tm总是从date::year_month_weekday转换而来落后一天。我的程序中是否遗漏了某些内容?程序如下,需要C++ 11编译。

#include <iostream>
#include <chrono>
#include <sys/time.h>
#include "date.h"

using namespace std; 
using namespace std::chrono; 
using namespace date;

int main(int argc, char *argv[]) {  
    date::year y(2017);
    date::month m(11);
    date::weekday wd((unsigned)5);
    date::weekday_indexed wi(wd,3);
    date::year_month_weekday dmwd(y, m, wi);
    std::cout <<  date::sys_days(dmwd) << std::endl; //prints 2017-11-17, which is the 3rd Friday of Nov 2017

    time_t tt = std::chrono::system_clock::to_time_t(date::sys_days(dmwd));        
    struct tm tm1;
    localtime_r(&tt, &tm1);
    std::cout << "tm1.tm_year = " << tm1.tm_year << std::endl;
    std::cout << "tm1.tm_mon = " << tm1.tm_mon << std::endl;
    std::cout << "tm1.tm_mday = " << tm1.tm_mday << std::endl;  //prints 16 instead of 17, one day behind. tm.mday is from 1 to 31.

    return 0; 
}

该程序的输出如下

2017-11-17
tm1.tm_year = 117  <-- 117+1900=2017
tm1.tm_mon = 10    <-- tm_mon starts form 0, so 10 means November
tm1.tm_mday = 16  <-- tm_mday starts from 1, so 16 is the 16-th day in a month

最佳答案

Howard Hinnant's date.h轨道 Unix Time对于大多数实际用途来说,它是 UTC。同时GitHub repository还有一个timezone library如果您需要处理本地时间或 UTC 以外的任何时区。

所以,是的,正如 Freddie Chopin 在评论中指出的那样,您正在看到 localtime_r 的效果。考虑您计算机的本地时区。

您可以将一天中的任何时间添加到 sys_days你要的那个。 sys_daysstd::chrono::time_point ,但带有days精确。所以一旦你有 sys_days ,您实际上在<chrono>内现在库,而不是日期库:

system_clock::time_point t = date::sys_days(dmwd) + 6h + 53min + 4s + 123us:

关于c++ - mktime() 给出的结果与 Howard Hinnant 的日期库(基于 std::chrono)不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43017997/

相关文章:

C++ RFC3339 时间戳与毫秒使用 std::chrono

c++ - lambdas 的捕获列表在 C++11 中是如何工作的?

c++ - 线性方程组,带约束的最小二乘法

c++ - 在线运行 C++ 代码?

mysql - 将日期作为字符串存储在 mysql 中是否安全?

Java - SimpleDateFormat 意外的解析行为

c++ - 错误 LNK2019 : unresolved external symbol linker can't find dll

excel - 单独列中的日期

c++ - 计时代码 "C2440: ' <function-style-cast >' : cannot convert from ' _CR' to 'std::chrono::milliseconds' 中的一个奇怪错误

c++ - 将 boost::chrono 计时机制包装到类编译错误中?