首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::tm或std::gmtime的限制是什么?

问std::tm或std::gmtime的限制是什么?
EN

Stack Overflow用户
提问于 2012-07-15 03:49:11
回答 1查看 1.6K关注 0票数 3

当我把最大可能的std::gmtime传递给我时,它对我来说是失败的。请参见以下测试:

代码语言:javascript
复制
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());

输出:

代码语言:javascript
复制
sizeof(std::time_t): 8
sizeof(long long): 8
sizeof(unsigned int): 4

failed
failed
failed
succeeded
succeeded

我在用VS2012。是否有标准的限制,我没有看到,或者这是与拙劣的?我能用什么替代方法呢?

EN

回答 1

Stack Overflow用户

发布于 2012-07-15 07:16:57

C++只说gmtime可能会失败。在大型输入上指定gmtime行为的标准是POSIX:

如果检测到错误,gmtime()将返回一个空指针并设置errno以指示错误。 偏误 如果以下情况,gmtime()和gmtime_r()函数将失败: 结果不能表示。

它没有直接说明限制是什么,虽然它确实说,如果从时代开始的秒是负的,它们与实际时间的关系是未定义。

作为另一种选择,尝试助推

代码语言:javascript
复制
auto testgmtime = [](std::time_t time)
{
    std::cout << boost::posix_time::from_time_t(time) << '\n';
};

(虽然在我的linux安装程序中,from_time_t()似乎比gmtime更早达到了上限)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11489260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档