Linux中的GetLocalTime的C ++等价物(毫秒!)

时间:2014-07-28 08:39:48

标签: c++ c linux time raspberry-pi

我一直在搜索超过一个小时,但我似乎无法找到解决方案!

我正在寻找一个函数,它给我一个与Windows上的GetLocalTime类似的结构。对我来说重要的是这个结构有小时,分钟,秒和毫秒。

localtime()不包括毫秒,因此我无法使用它!

我会使用标准库或另一个非常小的库来解决这个问题,因为我正在使用Raspberry Pi并且不能使用像boost这样的大型库!

3 个答案:

答案 0 :(得分:2)

如上所述,没有直接的等价物。如果您可以使用C ++ 11,<chrono>标头允许获得相同的结果,但不能在单个调用中。您可以使用high_resolution_clock以毫秒为单位获取当前的Unix时间,然后您可以获得localtime C函数来获取没有毫秒的时间,并使用当前的Unix时间以毫秒为单位来查找毫秒计数。看起来你必须编写自己的GetLocalTime实现,但是使用C ++ 11它不会很复杂。

答案 1 :(得分:1)

GetLocalTime不是常用的Linux功能。

阅读time(7),您可能需要clock_gettime(2),或者(由Joachim Pileborg评论),旧的gettimeofday(2)

如果您需要一些struct给出所有小时,分钟,秒,毫秒,您必须使用localtime(3)自行编码并明确计算毫秒部分。

类似下面的代码就是用毫秒打印时间

 struct timespec ts = {0,0};
 struct tm tm = {};
 char timbuf[64];
 if (clock_gettime(CLOCK_REALTIME, &ts))
    { perror("clock_gettime"), exit(EXIT_FAILURE);};
 time_t tim = ts.tv_sec;
 if (localtime(&tim, &tm))
    { perror("localtime"), exit(EXIT_FAILURE);};
 if (strftime(timbuf, sizeof(timbuf), "%D %T", &tm))
     { perror("strftime"), exit(EXIT_FAILURE);};
 printf("%s.%03d\n", timbuf, (int)(ts.tv_nsec/1000000));

答案 2 :(得分:1)

您可以使用以下组合:

  • clock_gettime(CLOCK_REALTIME);返回本地时间,最多毫秒(当然受实际时钟分辨率的限制);不关心本地时区信息,返回UTC时间。只需使用毫秒信息(来自tv_nsec字段)。
  • time();返回本地时间,直到秒 - 无毫秒 - 也是UTC时间。 time()结果(time_t)很容易转换为最终格式。

  • 然后使用localtime_r()转换time()结果;这设置了一个非常类似于Windows SYSTEMTIME的结构;结果是第二个,并考虑到当地时区信息。

  • 最后使用clock_gettime()结果设置毫秒字段。

这些例程是可记录的,不是已弃用的,可移植的 您可能需要调用tzset()一次(这会设置时区信息 - 一个C全局变量 - 来自操作系统环境 - 可能是一个繁重的操作)。