如何将无符号long longtypes的ticks转换为可读的时间格式?

我必须编写一个Linux的内核模块,它写入所有进程的开始时间。 我使用struct task_struct来获取有关进程的信息。

 struct task_struct *task = get_current(); struct task_struct *head; struct list_head *current_list; struct rtc_time time; list_for_each(current_list, &task->tasks) { head = list_entry(current_list, struct task_struct, tasks); rtc_time64_to_tm(head->se.exec_start, &time); printk(KERN_INFO "%d:%d:%d %d/%d/%d", time.tm_hour, time.tm_min, time.tm_sec, time.tm_year, time.tm_mon, time.tm_yday); } 

rtc_time64_to_tm()的参数long long ,但head->se.exec_starttypes是unsigned long long 。 这就是为什么我不能将其转换为可读的时间格式。

 // Convert seconds since 01-01-1970 00:00:00 to Gregorian date. void rtc_time64_to_tm(time64_t time, struct rtc_time *tm) 

如果代码真的需要在将来展示日期,那么可以利用YMD HMS模式每400年重复一次。

 #define SEC_PER400YEAR (60LL*60*24*(365L*400+97)) unsigned long long start = head->se.exec_start; unsigned long long year = 0; if (start > LLONG_MAX) { year = (start/SEC_PER400YEAR)*400; start %= SEC_PER400YEAR; } rtc_time64_to_tm((long long) start, &time); printk(KERN_INFO "%lld/%d/%d", time.tm_year +year, time.tm_mon, time.tm_yday); 

国际海事组织,一个超过LLONG_MAXstart值是可疑的。

注意: if (start > LLONG_MAX)不是真正需要的。

如果TZ,DST值得关注的话,这个方法需要稍微修改一下。