如何可移植地向time_t对象添加大量秒数
How do I portably add a large number of seconds to a time_t object?
嗯,我认为标题总结了它。假设我有一个 double
类型的对象,它是我在两个time_t
对象上运行 std::difftime
获得的,现在我想将生成的秒数加回time_t
对象。我不介意损失几分之一秒。
请注意,秒数可能很大(即大于 struct tm
中允许的 60 秒,但始终低于用于表示相应机器/实现上的秒的任何整数原语,并且永远不会大于 1 年的数量级,尽管最好我不希望这是一个限制)。
我将如何可移植地执行此操作(即根据 C 标准)?
我希望不必分为月,天,小时,分钟等,并手动将它们添加到struct tm
对象中。肯定有更好的方法!?
您可以使用time_t
值执行算术。
您可以设置两个相隔一秒的struct tm
对象(在一分钟中间的某个位置选择两次,不允许发生闰秒,以及在 DST 不会更改的本地时间),并对它们调用mktime()
以获取两个time_t
值。从较晚的值中减去这些time_t
值中较早的值,这将在系统上测量time_t
的相同单位数中为您提供一秒。将此值乘以要添加的秒数,然后将结果添加到原始time_t
值中。您可以通过再次调用原始值和新time_t
值的 difftime()
来检查结果,以查看秒差是否符合预期。
请注意,即使这样也不能保证是可移植的,因为从技术上讲,time_t
甚至不需要具有能够区分秒的分辨率,但这将是一个非常奇怪的实现。此外,如果time_t
是一个浮点值(这很不寻常),并且您想要添加非常非常多的秒数,则可能会遇到浮点精度问题。在这种情况下,您可以尝试添加小时而不是秒,并相应地设置两个struct tm
结构。可以想象,您可能会遇到足够长的秒数的溢出问题,而您对此无能为力。
localtime
将time_t
值转换为 struct tm
,将时间分解为小时、分钟、秒等。 适当调整秒数,然后使用 mktime
将结构中的值转换为time_t
。
似乎是这个的副本。
"C 日期/时间类型time_t实现为自某个日期以来的秒数,因此要向其添加秒数,您只需使用普通算术即可。
即使它是在 C 中,也应该没有区别C++ :)
- 队列未添加对象-C++11
- 创建/向容器添加对象时如何使用构造函数/析构函数
- 向 std::map 添加对象和自定义比较<>
- 如何在构造函数的静态列表中添加对象
- C++ std::vector 创建对象然后添加对象与在向量中创建对象之间的区别?
- 重载 + 运算符以使用 int 添加对象
- 如何在数组中添加对象成员
- 为什么类对象的向量在使用push_back添加对象时会删除对象
- 我如何阻止在多个向量中添加对象
- 指针集合和添加对象
- 动态添加对象
- 在c++中向向量添加对象vs向向量添加指针
- 添加c++对象到Objective C集合(NSSet)的麻烦
- 添加对象指针到链表c++
- c++ push_back只向vector中的位置0添加对象
- 在TStringList中添加对象
- 在c++中似乎不能正确地向数组中添加对象
- 使用push_back向vector添加对象工作正常,但使用访问器语法[]添加对象不工作
- 在for循环中向vector中添加对象
- 使用CMake从二进制文件编译并添加对象文件