当我把最大可能的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。是否有标准的限制,我没有看到,或者这是与拙劣的?我能用什么替代方法呢?
发布于 2012-07-15 07:16:57
C++只说gmtime可能会失败。在大型输入上指定gmtime行为的标准是POSIX:
如果检测到错误,gmtime()将返回一个空指针并设置errno以指示错误。 偏误 如果以下情况,gmtime()和gmtime_r()函数将失败: 结果不能表示。
它没有直接说明限制是什么,虽然它确实说,如果从时代开始的秒是负的,它们与实际时间的关系是未定义。
作为另一种选择,尝试助推
auto testgmtime = [](std::time_t time)
{
std::cout << boost::posix_time::from_time_t(time) << '\n';
};(虽然在我的linux安装程序中,from_time_t()似乎比gmtime更早达到了上限)
https://stackoverflow.com/questions/11489260
复制相似问题