关于算法:如何使用C在日期时间值中巧妙地转换若干秒

How to smartly convert a number of seconds in a date-time value using C

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

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

但我不知道怎么做…现在我有了以秒为单位的等价值,所以我知道从开始日期到时间已经过去了多少秒,但我不知道如何从这个值到当前日期时间值,所有的东西都经过了调整,只知道qt是不可用的(在这种情况下,在我能理解cplusplus.c中的解释之前,互联网并没有多大帮助)。OM等)

感谢您的帮助。


使用gmtime()

只需将勾号除以整秒数,再加上一个偏移量,即可将2014年1月1日改为1970年1月1日。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
"
,
      tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,
      tm.tm_hour, tm.tm_min, tm.tm_sec,
      fraction/10000);
}

[接受编辑后]

OP评论:"我试图从时间上使用这些方法。H和我没有成功,而且它考虑了1970年以来的时间计数,这不是我的情况。"

另一种方法是使用mktime()。这对@davidiesenstat提出的问题的依赖性较小。它依赖于tm_sec字段是一个具有足够宽度(如32位)的int,覆盖2014年至2082年。mktime()取出超出范围的字段并将其调整到预期范围。如果tm_sec是16位的,则可能需要对tm_mday, tm_hour, tm_min, tm_sec进行一些简单的调整。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
"
,
      tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,
      tm.tm_hour, tm.tm_min, tm.tm_sec,
      fraction/10000);
}


首先,将纳秒转换为秒是很简单的。第二,添加正确的秒数(从正确的epoch 1970-01-01开始),您必须知道从epoch UTC 2014-01-01 00:00:00开始有多少秒。Linux提示符下的日期命令将告诉您:

江户十一〔七〕号

所以你只需要做如下的事情:

时间t电流=1388534400+我的_10_nano_时间_函数()/100000000;

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

但是,由于时间以秒为单位,因此您必须自己计算毫秒,比如:

埃多克斯1〔8〕