std::gmtime
当我通过它时最大可能为std::time_t
。请参见下面的测试:什么是std :: tm或std :: gmtime的限制?
std::cout << "sizeof(std::time_t): " << sizeof(std::time_t) << '\n'
<< "sizeof(long long): " << sizeof(long long) << '\n'
<< "sizeof(unsigned int): " << sizeof(unsigned int) << "\n\n";
auto testgmtime = [](std::time_t time)
{
std::tm* ptm = std::gmtime(&time);
std::cout << (ptm ? "succeeded\n" : "failed\n");
};
testgmtime(std::numeric_limits<std::time_t>::max());
testgmtime(std::numeric_limits<long long>::max());
testgmtime(std::numeric_limits<long long>::max()-1);
testgmtime(static_cast<std::time_t>(std::numeric_limits<unsigned int>::max())*2);
testgmtime(std::numeric_limits<int>::max());
输出:
sizeof(std::time_t): 8
sizeof(long long): 8
sizeof(unsigned int): 4
failed
failed
failed
succeeded
succeeded
我使用VS2012。有没有标准的限制,我没有看到或是这个VS是蹩脚的? 作品有什么替代方案?
谢谢,这确实解释了非常高的数字。但是'(std :: numeric_limits :: max()-1)/ 10000000'也失败了,这只会是29247年的范围,2924年的范围也是如此,最后是292年的范围。我不知道它到底停在哪里,但是这个事情在大约300到3000年之间就失败了。我想我必须像你所建议的那样写我自己的 –
David
2012-07-15 13:08:26
你可以做一个二进制搜索来确定截止日期/时间。我很想知道它是什么。它可能会揭示逻辑。 – 2012-07-15 19:44:07
〜300到〜3000年将需要33到37位。我怀疑这个实现是否基本上是32位,尽管'time_t'是64位(注意你可以选择'time_t'的大小)。 – 2012-07-16 00:53:06