如果 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
因此允许某些实现具有例如 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)
.
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";
摘自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
andtime_t
are implementation-defined
因此允许某些实现具有例如 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 typetime_t
. If the calendar time cannot be represented, the function returns the value(time_t)(-1)
.
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";