我正在使用 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_days
是 std::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/