Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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

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

跟踪最实际的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_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: