如何巧妙地转换日期中的秒数
在我的嵌入式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