如何巧妙地转换日期中的秒数

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

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

但是我不知道该怎么做......现在我已经在几秒钟内获得了相同的值,所以我知道自开始日期时间过去了多少秒,但不知道如何从当前日期开始 - 时间价值与一切调整,只有在Qt这是不可用(和互联网并没有太大的帮助,在这种情况下,直到我可以理解的cplusplus.com等解释)

任何帮助赞赏。


使用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.%03lun",
      tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,
      tm.tm_hour, tm.tm_min, tm.tm_sec,
      fraction/10000);
}

[接受编辑后]

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

另一种方法是使用mktime() 。 这对@DavidEisenstat提出的问题的依赖性较小。 它依赖于tm_sec字段是一个足够宽度的int (比如32位),涵盖了2014年到2082年。mktime 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.%03lun",
      tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,
      tm.tm_hour, tm.tm_min, tm.tm_sec,
      fraction/10000);
}

首先,将纳秒转换为秒是微不足道的。 其次,自1970-01-01正确的时代开始增加正确的秒数,你将不得不知道从时代UTC 2014-01-01 00:00:00开始有多少秒钟。 在Linux提示符下的date命令会告诉你:

date -u -d "2014-01-01 00:00" +%s 1388534400

所以你只需要做一些事情:

time_t current = 1388534400 + my_10_nano_time_function()/ 100000000;

一旦你有了正确的time_t值,你可以使用所有的函数,比如localtime,gmtime和strftime。

但是,由于time_t是在几秒钟内,您将不得不自己计算毫秒,如下所示:

(my_10_nano_time_function()%/100000000)/100000

链接地址: http://www.djcxy.com/p/18537.html

上一篇: How to smartly convert a number of seconds in a date

下一篇: Finding the day in which a given year begins