C++ 在秒处创建时间点::max结果为负值
我试图通过将时间点设置为seconds::max来有效地表示永恒,我相信,它应该表示自大纪元以来的那个么多时间。但是,当这样做时,我得到-1作为结果时间点中自历元以来的时间。我不明白什么C++ 在秒处创建时间点::max结果为负值,c++,chrono,C++,Chrono,我试图通过将时间点设置为seconds::max来有效地表示永恒,我相信,它应该表示自大纪元以来的那个么多时间。但是,当这样做时,我得到-1作为结果时间点中自历元以来的时间。我不明白什么 #include <iostream> #include <chrono> using namespace std; using namespace std::chrono; int main() { auto tp1 = system_clock::time_point( s
#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;
int main() {
auto tp1 = system_clock::time_point( seconds::zero() );
auto tp2 = system_clock::time_point( seconds::max() );
cout << "tp1: " << duration_cast<seconds>(tp1.time_since_epoch()).count() << endl;
cout << "tp2: " << duration_cast<seconds>(tp2.time_since_epoch()).count() << endl;
return 0;
}
添加更多诊断程序会显示问题(在我的系统上):
#包括
#包括
使用名称空间std;
使用名称空间std::chrono;
int main(){
自动tp1=系统时钟::时间点(秒::零();
自动tp2=系统时钟::时间点(秒::最大值());
使用type=decltype(系统时钟::时间点(秒::零());
cout这里有一个快速而肮脏的程序,用于探索不同精度下系统时钟时间点的限制:
#include <chrono>
#include <iostream>
using days = std::chrono::duration
<int, std::ratio_multiply<std::ratio<24>, std::chrono::hours::period>>;
using years = std::chrono::duration
<double, std::ratio_multiply<std::ratio<146097, 400>, days::period>>;
template <class Rep, class Period>
void
max_limit(std::chrono::duration<Rep, Period> d)
{
std::cout << "[" << Period::num << '/' << Period::den << "] ";
std::cout << years{d.max()}.count() + 1970 << '\n';
}
int
main()
{
using namespace std;
using namespace std::chrono;
max_limit(nanoseconds{});
max_limit(microseconds{});
max_limit(milliseconds{});
max_limit(seconds{});
}
意思是基于纳秒的系统时钟在2262年溢出。如果你把它粗化到微秒,你在294247年溢出。依此类推
一旦你变粗到秒,最大值就会达到一个荒谬的范围。但是当你把它转换回系统时钟::时间点
,它至少和微秒一样好,也许和纳秒一样好(取决于你的平台),你就把它从水里吹出来了
要解决您的问题,我建议:
auto M = system_clock::time_point::max();
doh,我应该知道查找time_point::max()。也感谢您的测试程序;我没有费心去想time_point在内部会使用毫秒(或更精细)。
#include <chrono>
#include <iostream>
using days = std::chrono::duration
<int, std::ratio_multiply<std::ratio<24>, std::chrono::hours::period>>;
using years = std::chrono::duration
<double, std::ratio_multiply<std::ratio<146097, 400>, days::period>>;
template <class Rep, class Period>
void
max_limit(std::chrono::duration<Rep, Period> d)
{
std::cout << "[" << Period::num << '/' << Period::den << "] ";
std::cout << years{d.max()}.count() + 1970 << '\n';
}
int
main()
{
using namespace std;
using namespace std::chrono;
max_limit(nanoseconds{});
max_limit(microseconds{});
max_limit(milliseconds{});
max_limit(seconds{});
}
[1/1000000000] 2262.28
[1/1000000] 294247
[1/1000] 2.92279e+08
[1/1] 2.92277e+11
auto M = system_clock::time_point::max();