【问题标题】:Retrieve Linux Time using struct timespec使用 struct timespec 检索 Linux 时间
【发布时间】:2018-05-11 22:38:16
【问题描述】:

有人可以建议我如何使用

检索 linux 时间

结构时间规范

类型?它只是给了我自 Epoch 以来的时间。我可以使用这种数据类型获得实际的 Linux 时间吗?

背景简介:我正在嵌入式设备上编写一个记录器实用程序,其时间戳分辨率以毫秒/微秒为单位。源添加了目标组件使用的时间戳。

struct stLogItem logitem; //stLogItem has a member, struct timespec ts    
clock_gettime(clk_id, &logitem.ts);

目标组件正在文件/控制台上打印此日志时间戳。但是打印出来的日期是自 Epoch 以来的时间,而不是实际的 Linux 日期。

打印出来的数据是: 1970-01-01 23:30:07.586864475

而 Linux 日期不同,如下所示:

root@imh:# 日期

2017 年 11 月 14 日星期二 11:34:12 UTC

不是格式问题。它是关于获取当前的 Linux 时间(以纳秒为单位)。

【问题讨论】:

  • 什么是“实际 Linux 时间”?距离 Linus 第一次宣布的时间? :)
  • 你可能想看看localtime*()
  • UTC 2017 年 11 月 14 日星期二 10:06:34(在 shell 上输入“日期”后)
  • Google 如何在 linux c 中获取日期和时间。时间(),本地时间()
  • 这个更新还不够。您需要显示产生无效输出的实际代码。

标签: c linux posix timespec


【解决方案1】:

是什么阻止你做:

#include <time.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
  struct timespec ts;    
  clock_gettime(CLOCK_REALTIME, &ts);

  char * p = ctime(&ts.tv_sec); /* Note that ctime() isn't thread-safe. */
  p[strcspn(p, "\r\n")] = 0;

  printf("Date: %s %ldns\n", p, ts.tv_nsec);

  ...
}

来自the relevant documentation

所有实现都支持系统范围的实时时钟,即 由 CLOCK_REALTIME 标识。它的时间代表秒和 自纪元以来的纳秒。

(POSIX documentation is here.)

【讨论】:

  • 这只是打印输出“Thu Jan 1 23:28:20 1970 690758173ns”,其中“date”命令的结果是输出“Tue Nov 14 10:59:57 UTC 2017”。你可以看到两个日期有不同的时间值(忘了格式)
  • 这是因为 ts 变量有那个时间。 ctime 只是将输入时间作为字符串返回
  • @Irfan:如果上面的代码真的给你“Thu Jan 1 23:28:20 1970 ...”,那么你的系统时钟似乎搞砸了,正在运行时间不对。
  • @Irfan 您应该使用产生该输出的实际代码来更新您的问题。很可能你做错了什么。
【解决方案2】:

在调用clock_gettime 后,ts.tv_sec(类型为time_t)将填充自纪元以来的时间戳(以秒为单位)。您可以将其直接传递给localtime

struct timespec ts;    
clock_gettime(clk_id, &ts);
struct tm *my_tm = localtime(&ts.tv_sec);

现在my_tm 指向struct tm,它的时间分解为年/月/日/小时/分钟/秒,ts.tv_nsec 具有纳秒部分。

【讨论】:

  • 注意,分解时间的tm_yeartm_mon字段有奇怪的编码,strftime()可以用来格式化时间字符串(但纳秒必须分开小心处理) .
猜你喜欢
  • 2015-05-09
  • 2011-08-02
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 2011-04-21
  • 1970-01-01
相关资源
最近更新 更多