str*_*str 5 c++ time-t mktime difftime
我想用我的简单程序做的是计算两个日期之间的秒差.
time_t referenceDate;
time_t dateNow = time(0);
struct tm referenceDateComponent = {0};
referenceDateComponent.tm_hour = 0;
referenceDateComponent.tm_min = 0;
referenceDateComponent.tm_sec = 0;
referenceDateComponent.tm_year = 89;
referenceDateComponent.tm_mon = 11;
referenceDateComponent.tm_mday = 31;
referenceDate = mktime(&referenceDateComponent);
long seconds = difftime(dateNow, referenceDate);
Run Code Online (Sandbox Code Playgroud)
Whit应用程序上面的代码工作正常,但如果尝试设置tm.year负数(在1900年之前构建日期)mktime()函数返回-1
我知道该time_t类型只管理从1970年1月1日UTC开始的日期,根据文档:
由于历史原因,它通常被实现为表示自UTC时间1970年1月1日00:00(即,unix时间戳)以来经过的秒数的整数值.尽管库可以使用替代时间表示来实现此类型.
我知道还有Boost库,但对我来说不是一个有用的解决方案.
所以我的问题是,从1970年以前的日期开始,有什么办法可以在几秒钟内获得变化?
我建议使用C++ 11 std::chrono命名空间和<chrono>标准头文件以及它们内部的标准函数和类.
您也可以考虑difftime C标准和本地时间:mktime
至少升级到C++ 11有很多其他好的理由(如果可以,还有C++ 14).好几个最近的自由软件编译器GCC和锵/ LLVM支持,标准(编译-std=c++11或-std=gnu++14如果你想GNU扩展&C++ 14)
顺便说一下,你的问题比你想象的要复杂得多.日历已经改变.朱利安/格利高里历转变发生在XX 日在俄罗斯的世纪.我已故的母亲出生于1919年,在移民和内战期间,在一个俄罗斯村庄,其法律制度当时有争议(俄罗斯革命没有立即发生).她有一些文件提到1919年12月13 日,其他文件提到1919年12月26 日,指的是两个不同日历中的同一天.你的软件将如何处理?我甚至不确定时区是否足够!
顺便说一下,我不确定Boost或C++ 11 <chrono>能否可靠地处理这些日历问题.
nwp在评论中提到了一个非常好的计算机视频视频:时间和时区问题.
你已经回答了这个问题。time_t表示自 UNIX 纪元以来的秒数,而不是自该时间之前的任意时间以来的秒数。你试图做的事情从根本上来说是没有意义的。
如果您被困在 C++03 上,无论您对可以使用什么和不能使用什么有模棱两可的声明,您都必须使用Boost.DateTime。
除此之外,标准库在<chrono>.