如何使用 C 巧妙地转换日期时间值中的秒数

Mom*_*gil 5 c algorithm time date

在我的嵌入式 Linux 应用程序中,我有一个“滴答计数”计数器,从 2014 年 1 月 1 日 00:00:00 开始计数,每 10 纳秒增加 1。

我希望能够选择“滴答计数”计数器的当前值,将其打印为系统的当前日期时间(年、月、日、小时、分钟、秒和毫秒),已经考虑了诸如闰年、二月有 28/29 天等,这使用纯 C 方法(来自 time.h 等)。

但我不知道该怎么做...现在我有以秒为单位的等效值,所以我知道自开始日期时间以来已经过去了多少秒,但不知道如何从该日期到当前日期-一切调整后的时间值,仅在 Qt 中不可用(在这种情况下,互联网并没有多大帮助,直到我能理解 cplusplus.com 等中的解释)

任何帮助表示赞赏。

chu*_*ica 3

使用gmtime()

只需除以滴答计数即可获得整数秒数,并添加偏移量以将纪元从 2014 年 1 月 1 日更改为 1970 年 1 月 1 日。

void print_time(unsigned long long tick_count) {

  static const unsigned long ticks_per_sec = 100000000L;
  static const time_t epoch_delta = 16071L*24*60*60;
  time_t seconds = tick_count/ticks_per_sec + epoch_delta;

  unsigned long fraction = tick_count%ticks_per_sec;
  struct tm tm = *gmtime(&seconds);
  printf("%4d-%02d-%02d %02d:%02d:%02d.%03lu\n",
      tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,
      tm.tm_hour, tm.tm_min, tm.tm_sec,
      fraction/10000);
}
Run Code Online (Sandbox Code Playgroud)

[接受编辑后]

OP 评论“我尝试使用 time.h 中的方法,但没有成功,而且它考虑了自 1970 年以来的时间计数,这不是我的情况”

另一种方法是使用mktime(). 这不太依赖@DavidEisenstat 提出的问题。它依赖于tm_sec字段具有int足够的宽度(例如 32 位)来覆盖 2014 到 2082 年。 mktime()获取超出范围的字段并将其调整到预期范围。应该tm_sec是 16 位的,可能需要进行一些简单的调整tm_mday, tm_hour, tm_min, tm_sec

void print_time2(unsigned long long tick_count) {

  static const unsigned long ticks_per_sec = 100000000L;
  unsigned long fraction = tick_count%ticks_per_sec;
  unsigned long long secondsFromJan12014 = tick_count/ticks_per_sec;
  struct tm tm = {0};
  tm.tm_year = 2014 - 1900;
  tm.tm_mday = 1;
  tm.tm_sec = secondsFromJan12014;

  if (mktime(&tm) == (time_t)(-1)) Handle_Failure();
  printf("%4d-%02d-%02d %02d:%02d:%02d.%03lu\n",
      tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,
      tm.tm_hour, tm.tm_min, tm.tm_sec,
      fraction/10000);
}
Run Code Online (Sandbox Code Playgroud)