mktime()给出的结果与Howard Hinnant不同;s日期库(基于标准::计时) 我使用Howard Hinnant的日期C++库(),但我使用它有一些混淆。下面是我使用此库打印2017年11月3日星期五的年-月-日的程序。date::year\u month\u weekday类与date::sys\u days()一起使用时,会显示正确的日期(2017年11月17日),但当我使用std::chrono::system\u clock::to\u time\u t将其转换为struct tm时,存储在该tm中的结果将变为2017年11月16日。我测试了其他案例,它似乎是从date::year\u month\u weekday转换而来的struct tm,总是落后一天。我在节目中错过了什么吗?程序如下:需要编译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; } #包括 #包括 #包括 #包括“date.h” 使用名称空间std; 使用名称空间std::chrono; 使用名称空间日期; intmain(intargc,char*argv[]){ 日期:y年(2017年); 日期:月m(11); 日期:工作日wd((未签名)5); 日期:工作日(wd,3); 日期:年、月、工作日dmwd(y、m、wi); std::cout
跟踪最实际的UTC。同时,如果您需要处理本地时间或UTC以外的任何时区,也会有一个错误 是的,正如弗雷迪·肖邦在评论中指出的那样,你看到了mktime()给出的结果与Howard Hinnant不同;s日期库(基于标准::计时) 我使用Howard Hinnant的日期C++库(),但我使用它有一些混淆。下面是我使用此库打印2017年11月3日星期五的年-月-日的程序。date::year\u month\u weekday类与date::sys\u days()一起使用时,会显示正确的日期(2017年11月17日),但当我使用std::chrono::system\u clock::to\u time\u t将其转换为struct tm时,存储在该tm中的结果将变为2017年11月16日。我测试了其他案例,它似乎是从date::year\u month\u weekday转换而来的struct tm,总是落后一天。我在节目中错过了什么吗?程序如下:需要编译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; } #包括 #包括 #包括 #包括“date.h” 使用名称空间std; 使用名称空间std::chrono; 使用名称空间日期; intmain(intargc,char*argv[]){ 日期:y年(2017年); 日期:月m(11); 日期:工作日wd((未签名)5); 日期:工作日(wd,3); 日期:年、月、工作日dmwd(y、m、wi); std::cout,c++,date,chrono,mktime,C++,Date,Chrono,Mktime,跟踪最实际的UTC。同时,如果您需要处理本地时间或UTC以外的任何时区,也会有一个错误 是的,正如弗雷迪·肖邦在评论中指出的那样,你看到了localtime\r将计算机的本地时区考虑在内的影响 您可以将一天中的任何时间添加到所需的sys\u-days。sys\u-days是std::chrono::time\u点,但具有days精度。因此,一旦您拥有了sys\u-days,您现在实际上就在库中,而不是在日期库中: system_clock::time_point t = date::sys_da
localtime\r
将计算机的本地时区考虑在内的影响
您可以将一天中的任何时间添加到所需的sys\u-days
。sys\u-days
是std::chrono::time\u点
,但具有days
精度。因此,一旦您拥有了sys\u-days
,您现在实际上就在
库中,而不是在日期库中:
system_clock::time_point t = date::sys_days(dmwd) + 6h + 53min + 4s + 123us:
您是否尝试过使用
gmtime\u r()
而不是localtime\u r()
?是的,我刚刚尝试过,gmtime\u r
确实给出了一致的结果,感谢您的提示。因为日期::年\月\周
不包含时间(小时和分钟)信息,我想知道当转换为struct tm
时,日期库是如何处理的。我还打印了struct tm
的tm\u-hour
和tm\u-min
从date::year\u-month\u-weekday
转换而来的tm\u-min
。对于所有情况,似乎tm\u-min==0
都是因为我是我n UTC-6时区?Fwiw,这里是创建dmwd
的替代语法:auto-dmwd=fri[3]/2017年11月;
非常感谢您的解释。还有一个问题,我试图将sys\u days(dmwd)
更改为local\u days(dmwd)
,但它不会编译,说明没有匹配的函数。使用本地日
的正确方法是什么?我应该将时区库也添加到我的程序中吗?再次感谢!@WorkOnly:我刚刚尝试了那个实验,它为我编译。哪个编译器/版本?你能在某个地方设置一个演示吗首先是一个沙盒:。我可以在我的原始帖子中毫无问题地编译这个程序,但是当我用local\u days(dmwd)
替换sys\u days(dmwd)
,它会给出以下错误消息(Ubuntu 16.04上的gcc 5.4,带有g++-std=c++11 date time.cpp
):date time.cpp:in函数“int main”(int,char**)“:date\u time.cpp:18:73:错误:没有匹配函数用于调用“std::chrono::\u V2::system\u clock::to\u time\t(date::local\u days)”time\t tt=std::chrono::system\u clock::to\u time(date::local\u days(dmwd))^文件中包含的日期时间。cpp:2:0:
(续)/usr/include/c++/5/chrono:734:7:注:候选者:静态时间std::chrono::\u V2::系统时钟::to_time_t(const time_point&)to_time_t(const time_point&)to_time_t(const time_point&)noexcept^/usr/include/c++/5/chrono:734:7:注:参数1从“date::local_days”{std::chrono::time_point}到“const time_point”没有已知的转换{aka const std::chrono::time_point&}“
@WorkOnly:好的,这是有意义的。system\u clock::to\u time\u t
将system\u clock::time\u point
作为参数。sys\u days
是粗略的系统时钟::time\u point
的类型定义,并隐式转换为system\u clock::time\u point
。而local\u days
是chrono::时间点
与系统时钟
没有任何关系。编译时错误可以防止您意外地混淆这两类时间点
s。
system_clock::time_point t = date::sys_days(dmwd) + 6h + 53min + 4s + 123us: