获取当前时间的未来时间规格

Get the future timespec of the current time

我可以使用 timespec_get C11 函数获取当前时间。假设我想检索当前时间的下一毫秒的timespec值,我应该如何编写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() return 是一个规范化的 struct timespec 值(因此 tv_nsec 在 0..999,999,999.

范围内,算术是安全的

您可以简单地修改 now 和 return 它,而不是创建和修改 due。不过,这不是什么大问题。

您可以创建和使用如下名称:

enum
{
    MILLISECONDS_PER_SECOND = 1000,
    NANOSECONDS_PER_SECOND  = 1000000000,
    NANOSECONDS_PER_MILLISECOND = NANOSECONDS_PER_SECOND / MILLISECONDS_PER_SECOND
};

我不确定这是否值得。

如果您需要处理负偏移量(ms 的负值),您还有更多工作要做,在添加负数量并递减 [=16= 之后处理负结果 tv_nsec ] 如有必要。