在C ++中偏移time_t

时间:2015-03-23 04:51:01

标签: c++ linux time

我正在处理一个系统生成的时间戳,其中纪元不是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机器上运行。

1 个答案:

答案 0 :(得分:0)

time_t已经成为C遗产。对于你自己的时间,你应该真的上课。这类课程的主要优点是可以避免意外行为。您可以定义哪些运算符有意义,operator^可能没有。您可以定义支持哪些转化,这可能只是time_t(如果有的话 - 替代方法是.getCtime()方法)

在内部,您可以使用unsigned long,这样可以为提供至少 68年的额外费用。 Y2038问题是因为time_t已签名,而UNIX时代则从1902年持续到2038年。