C++中的时间偏移

C++中的时间偏移,c++,linux,time,C++,Linux,Time,我处理的是一个系统生成的时间戳,该系统的历元不是标准的UNIX历元,而是从1970年1月1日午夜开始的秒,而是从1965年开始的。这个问题有点相关。因此,我有一个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

我处理的是一个系统生成的时间戳,该系统的历元不是标准的UNIX历元,而是从1970年1月1日午夜开始的秒,而是从1965年开始的。这个问题有点相关。因此,我有一个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;
}
到目前为止,在混合了真实和合成测试数据的情况下,它似乎能按预期工作。然而,有没有更好的方法来处理这种情况?有没有什么微妙的方式可以打破这种局面?其他信息,如果有关系的话:时间戳分布在1981年到今天,程序在Linux机器上运行。

time\t已经是C遗留。为了你自己的时间,你真的应该去上课。此类类的主要优点是可以避免意外行为。您可以定义哪些运算符有意义,而运算符^可能没有意义。您可以定义支持哪些转换,如果有的话,这可能只是为了计时-另一种方法是.getCtime方法


在内部,您可以使用未签名的long,这至少会给您额外68年的时间。Y2038的问题是因为时间是经过签名的,UNIX时代从1902年运行到2038年

感谢您的输入,我通常倾向于这样做,作为对我自己和其他阅读代码的人的一个提示,即强制转换是有意的。@BhargavBhat:当转换为无法存储所有原始值的类型时,它可以抑制编译器警告,无论是由于使用较少的字节还是有符号或无符号。更一般地说,在UNIX纪元中存储日期/时间的32位值将在2038年结束—您已经额外缩短了~5年—因此应该一直到2033年左右。@TonyD:是的,这似乎是正确的。我使用的一个合成日期非常接近UINT32_MAX,我在2033年11月的某个地方得到了一个日期。
uint32_t raw_time;
time_t timestamp = fix_timestamp(raw_time);
struct tm timeinfo;
gmtime_r(&timestamp, &timeinfo);