获取当前时间的未来时间规格
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
] 如有必要。
我可以使用 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
] 如有必要。