在 C++ 中偏移 time_t

Offsetting time_t in C++

我正在处理一个系统生成的时间戳,其中纪元不是自 1970 年 1 月 1 日午夜以来的标准 UNIX 秒纪元(而是从 1965 年某处开始)。 This 问题有点相关。所以,我有一个 "fixup" 函数来处理这个偏移量:

time_t fix_time(uint32_t raw_time)
{
    const int32_t epoch_offset = 157680000; /* offset wrt UNIX epoch */
    time_t fixedTime = static_cast<time_t>(raw_time - epoch_offset);
    return fixedTime;
}

并在其余代码中继续使用标准库函数:

uint32_t raw_time;
time_t timestamp = fix_timestamp(raw_time);
struct tm timeinfo;
gmtime_r(&timestamp, &timeinfo);

它似乎按预期工作(到目前为止,混合了真实和合成的测试数据)。但是,有没有更好的方法来处理这种情况?有什么微妙的方法可以打破这种情况吗?重要的附加信息:时间戳分布在 1981 年到今天,程序在 Linux 机器上运行。

time_t 已经是 C 语言的遗产了。对于你自己的时间,你真的应该做一个class。这种 class 的主要优点是可以避免意外行为。您定义哪些运算符有意义,而 operator^ 可能没有意义。您定义支持哪些转换,这可能只是 time_t(如果有的话 - 替代方法是 .getCtime() 方法)

在内部,您可以使用 unsigned long,它可以让您 至少 多活 68 年。 Y2038问题是因为time_t是有符号的,UNIX时代从1902年跑到2038年。