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等)
感谢您的帮助。
使用
只需将勾号除以整秒数,再加上一个偏移量,即可将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年以来的时间计数,这不是我的情况。"
另一种方法是使用
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〕