我可以使用timespec_get
C11函数获取当前时间。假设我想检索当前时间的下一个毫秒的时间规范值,我应该如何编写get_due_time
函数?
struct timespec get_due_time(long ms) {
struct timespec now, due;
timespec_get(&now, TIME_UTC);
...
return due;
}
struct timespec get_due_time(long ms)
{
assert(ms >= 0);
struct timespec now, due;
timespec_get(&now, TIME_UTC);
due.tv_sec = now.tv_sec + ms / 1000;
due.tv_nsec = now.tv_nsec + (ms % 1000) * 1000000;
if (due.tv_nsec >= 1000000000)
{
due.tv_nsec -= 1000000000;
due.tv_sec++;
}
return due;
}
通过将整秒添加到当前时间的秒部分(一秒有 1000 毫秒(来处理ms
的大值。 通过乘以一百万(一毫秒内的纳秒数(来处理ms
值的亚秒部分。 通过从tv_nsec
中减去十亿(每秒的纳秒数(并增加tv_sec
部分来处理tv_nsec
溢出。 假设timespec_get()
返回规范化struct timespec
值(因此tv_nsec
在 0..999,999,999 范围内(,算术是安全的。
您可以简单地修改now
并返回它,而不是创建和修改due
。 不过,这不是一个大问题。
您可以创建和使用以下名称:
enum
{
MILLISECONDS_PER_SECOND = 1000,
NANOSECONDS_PER_SECOND = 1000000000,
NANOSECONDS_PER_MILLISECOND = NANOSECONDS_PER_SECOND / MILLISECONDS_PER_SECOND
};
我不确定这是否值得。
如果您需要处理负偏移量(ms
的负值(,您还有更多工作要做,在添加负量后处理负结果tv_nsec
并在必要时递减tv_sec
。