将毫秒转换为GNU端口的timespec

时间:2013-02-22 12:48:08

标签: c linux datetime gnu timespec

我想将毫秒转换为GNU Linux使用的timespec结构。我尝试过以下代码。

  timespec GetTimeSpecValue(unsigned long milisec)
  {
    struct timespec req;
    //long sec = (milisecondtime /1000);
    time_t sec = (time_t)(milisec/1000);
    req->tv_sec = sec;
    req->tv_nsec = 0;
    return req;
  }

运行此代码会出现以下错误。

  

在'GetTimeSpecValue'之前预期'=',',',';','asm'或'__attribute__'

我还在代码中包含 time.h 文件。

3 个答案:

答案 0 :(得分:11)

timespec结构表示两个部分的时间 - 秒和纳秒。因此,从毫秒转换的算法非常简单。一秒有千毫秒,一毫秒有一千微秒,一微秒有一千纳秒,为此我们感谢SI。因此,我们首先需要将毫秒除以千来获得几秒钟。比方说,例如,1500毫秒/ 1000 = 1.5秒。给定整数算术(不是浮点),剩余部分被丢弃(即1500/1000仅等于1,而不是1.5)。然后我们需要取一个表示毫秒绝对不到一秒的余数,并将其乘以一百万来将其转换为纳秒。为了得到除以1000的余数,我们使用module operator (%)(即1500 % 1000 is equal to 500)。例如,让我们将4321毫秒转换为秒和纳秒:

  1. 4321(毫秒)/ 1000 = 4(秒)
  2. 4321(毫秒)%1000 = 321(毫秒)
  3. 321(毫秒)* 1000000 = 321000000(纳秒)
  4. 了解上述内容,唯一剩下的就是编写一些C代码。很少有事情你没有做对:

    1. 在C中,您必须使用struct为结构数据类型添加前缀。例如,不要说timespec,而是说struct timespec。但是,在C ++中,您不必这样做(不幸的是,在我看来)。
    2. 您无法从C中的函数返回结构。因此,您需要通过指针将结构传递给使用该结构执行某些操作的函数。
    3. 编辑:这与(Return a `struct` from a function in C)相矛盾。

      好的,说够了。下面是一个简单的C代码示例:

      #include <time.h>
      #include <stdlib.h>
      #include <stdio.h>
      
      static void ms2ts(struct timespec *ts, unsigned long ms)
      {
          ts->tv_sec = ms / 1000;
          ts->tv_nsec = (ms % 1000) * 1000000;
      }
      
      static void print_ts(unsigned long ms)
      {
          struct timespec ts;
          ms2ts(&ts, ms);
          printf("%lu milliseconds is %ld seconds and %ld nanoseconds.\n",
                 ms, ts.tv_sec, ts.tv_nsec);
      }
      
      int main()
      {
          print_ts(1000);
          print_ts(2500);
          print_ts(4321);
          return EXIT_SUCCESS;
      }
      

      希望它有所帮助。祝你好运!

答案 1 :(得分:2)

试试这个:

struct timespec GetTimeSpecValue(unsigned long millisec) {
    struct timespec req;
    req.tv_sec=  (time_t)(millisec/1000);
    req.tv_nsec = (millisec % 1000) * 1000000;
    return req;
}

我认为struct timespec不是typedef'ed,因此你需要在struct之前加上timespec。如果你想要精确的话,可以计算纳米第二部分。请注意,req不是指针。因此,无法使用“ - &gt;”

访问成员

答案 2 :(得分:0)

结合包括杰弗里(Geoffrey)的评论在内的一些调整,下面的代码避免了小延迟的划分和长延迟的取模:

void msec_to_timespec(unsigned long msec, struct timespec *ts)
{
    if (msec < 1000){
        ts->tv_sec = 0;
        ts->tv_nsec = msec * 1000000;
    }
    else {
        ts->tv_sec = msec / 1000;
        ts->tv_nsec = (msec - ts->tv_sec * 1000) * 1000000;
    }
}