我正在处理一个系统生成的时间戳,其中纪元不是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(×tamp, &timeinfo);
它似乎按预期工作(到目前为止,由实际和综合测试数据组合而成)。但是,有没有更好的方法来处理这种情况?这有什么微妙的方法可能会破坏吗?附加信息如果重要:时间戳分布在1981年到当天,程序在Linux机器上运行。
答案 0 :(得分:0)
time_t
已经成为C遗产。对于你自己的时间,你应该真的上课。这类课程的主要优点是可以避免意外行为。您可以定义哪些运算符有意义,operator^
可能没有。您可以定义支持哪些转化,这可能只是time_t
(如果有的话 - 替代方法是.getCtime()
方法)
在内部,您可以使用unsigned long
,这样可以为提供至少 68年的额外费用。 Y2038问题是因为time_t
已签名,而UNIX时代则从1902年持续到2038年。