Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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
C++ 在秒处创建时间点::max结果为负值_C++_Chrono - Fatal编程技术网

C++ 在秒处创建时间点::max结果为负值

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

我试图通过将时间点设置为seconds::max来有效地表示永恒,我相信,它应该表示自大纪元以来的那个么多时间。但是,当这样做时,我得到-1作为结果时间点中自历元以来的时间。我不明白什么

#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();