假设time_t以秒为单位是多么安全?

Ant*_*t6n 7 c++ time date time-t

我经常做很多计算,通过添加秒来构建相对于其他时间对象的时间对象.该代码应该在嵌入式设备和服务器上运行.大多数文件说它time_t是一些算术类型,通常存储自纪元以来的时间.假设time_t存储了几秒钟后,它有多安全?如果我们可以假设,那么我们可以只使用加法和减法,而不是localtime,mktimedifftime.

到目前为止,我已经通过使用a来解决问题constexpr bool time_tUsesSeconds,表示假设time_t使用秒是否安全.如果它是不可移动的假设time_t是在几秒钟内,有没有办法自动初始化该常量?

time_t timeByAddingSeconds(time_t theTime, int timeIntervalSeconds) {
    if (Time_tUsesSeconds){
        return theTime + timeIntervalSeconds;
    } else {
        tm timeComponents = *localtime(&theTime);
        timeComponents.tm_sec += timeIntervalSeconds;
        return mktime(&timeComponents);
    }
}
Run Code Online (Sandbox Code Playgroud)

Giu*_*nco 10

事实上它是在几秒钟内由POSIX规范说明,因此,如果您编写符合POSIX的环境,您可以依赖它.

C++标准还规定time_t必须是算术类型.

无论如何,unix计时系统(自Epoch以来的第二个)将在2038年溢出.因此,很可能在此日期之前,C++实现将切换到其他非int数据类型(64b int或更复杂的数据类型) ).无论如何,切换到64b int将破坏与先前代码的二进制兼容性(因为它需要更大的变量),并且应该重新编译所有内容.使用32b opaque句柄不会破坏二进制兼容性,你可以更改底层库,一切仍然可以工作,但time_t不再是几秒钟的时间,它是一个数组的索引,以秒为单位.出于这个原因,建议您使用您提到的函数来操作time_t值,并且不要假设任何内容time_t.

  • @MatteoItalia - C和C++标准都要求`time_t`是算术类型. (4认同)
  • 实际上,除了算术类型(在POSIX系统上是必需的)之外,没有人会将`time_t`实现为其他任何东西.当前64位类UNIX系统已将其实现为64位整数(因为64位体系结构的ABI更改已经强制重新编译),[在Windows上也是如此](http://msdn.microsoft.com/en -us /库/ 3b2e7499.aspx).任何其他解决方案都必然会更具创伤性,因为即使在非POSIX系统上将`time_t`视为"自纪元以来的秒数"也是常见的,并且改变其语义会默默地打破很多东西. (2认同)