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