如果 C++ 中的 sizeof(std::time_t) == sizeof(std::uint64_t) 是否保证 2038 安全?

Is it guaranteed to be 2038-safe if sizeof(std::time_t) == sizeof(std::uint64_t) in C++?

摘自cppref

Implementations in which std::time_t is a 32-bit signed integer (many historical implementations) fail in the year 2038.

但是,文档没有说明如何检测当前实施是否是 2038 年安全的。所以,我的问题是:

如果 sizeof(std::time_t) == sizeof(std::uint64_t) 在C++中是否保证2038年安全?

实际上。在主要操作系统的所有现代实现中,time_t 是自 POSIX 纪元以来的秒数,因此如果 time_t 大于 int32_t 则它不受 y2038 问题的影响

您还可以检查__USE_TIME_BITS64是否在32位Linux中定义以及_USE_32BIT_TIME_T是否在32位Windows中定义以了解它是否是2038 -安全


但是对于 C++ 标准,事情并没有那么简单。 C++ 中的 time_t<ctime> 中定义,在 C 标准中具有 same content as <time.h>。在 C time_t 中没有定义任何格式

3. The types declared are size_t (described in 7.19);

clock_t

and

time_t

which are real types capable of representing times;

4. The range and precision of times representable in clock_t and time_t are implementation-defined

http://port70.net/~nsz/c/c11/n1570.html#7.27.1p3

因此允许某些实现具有例如 double 作为 time_t 并存储从公元前 16383 年 1/1 开始的皮秒,或者甚至是只有 32 个值位的 64 位整数和32 个填充位。这可能是 difftime() returns a double

的原因之一

要在 运行 时间检查 y2038 问题,您可以使用 mktime

The mktime function returns the specified calendar time encoded as a value of type time_t. If the calendar time cannot be represented, the function returns the value (time_t)(-1).

http://port70.net/~nsz/c/c11/n1570.html#7.27.2.3p3

struct tm time_str;
time_str.tm_year   = 2039 - 1900;
time_str.tm_mon    = 1 - 1;
time_str.tm_mday   = 1;
time_str.tm_hour   = 0;
time_str.tm_min    = 0;
time_str.tm_sec    = 1;
time_str.tm_isdst = -1;
if (mktime(&time_str) == (time_t)(-1))
    std::cout << "Not y2038 safe\n";