朴素的方法(C)
time_t now = time(0);
tm *e_lt = gmtime(&now);
time_t s_tm = time(0);
s_tm -=60*60*24*10;
tm *s_lt = gmtime(&s_tm);
值得注意的是,gmtime
返回的指针指向的那片
tm 结构体是全局共享的,也就是说两次 gmtime
调用会返回同一个地址,第二次 gmtime
把第一次的结果覆盖了。
加减时间戳这个想法是可以的,只是要换一种方式去字符串化时间戳。
其他问题
- 闰秒
- 夏令时
UNIX 时间戳
UNIX 时间戳直接加减时可以的,因为 UNIX
时间不考虑闰秒和夏令时,绝对时间轴,每天就是 24 * 60 *
60 秒。 也可以通过 struct tm
结构成员操作来计算偏移时间。
Unix 时间戳是从 1970 年 1 月 1 日( UTC/GMT 的午夜)开始所经过的秒数,不考虑闰秒。
关于闰秒
闰秒的显示一般来说是不考虑的,闰秒的播发是通过网络或者 GPS ,比如 NTP/PTP 时间同步这些,核心是纠正真实时间与 UTC 时间的偏差。Unix 时间戳可以看作是 UTC 的一种表达方式而已。 显示是根据当地时区夏令时来计算的。
想详细了解可以看看初步的 GPS 时间设计。
C++ 20 Standard
https://en.cppreference.com/w/cpp/chrono/day