【问题标题】:Converting clock time (real world time) to jiffies and vice versa将时钟时间(现实世界时间)转换为 jiffies,反之亦然
【发布时间】:2021-02-24 13:10:35
【问题描述】:

我使用mktime64 将时钟时间转换为 jiffies 值。

// year, mon, day, hour, min, sec
unsigned long my_jiffies = mktime64(2020, 2, 24, 3, 2, 50);

以上代码的输出为:1582513370

  • 如何将该 jiffies 值转换回时钟时间?

【问题讨论】:

  • 这能回答你的问题吗? Converting jiffies to milli seconds
  • mytime64 将参数值转换为自 1970-01-01 00:00:00 以来的秒数,而不是 jiffies。每秒有 HZ jiffies,但 jiffies 计数器自 1970-01-01 00:00:00 以来不计算时间。
  • jiffies 计数器计算系统滴答声,并在内核启动期间设置为与实际时间无关的某个初始值。此外,在 32 位系统上,它大约每 49710/HZ 天回绕一次,尽管第一次回绕通常设置为在几分钟内发生。

标签: c linux-kernel


【解决方案1】:

[此答案适用于 Linux 内核,因为 已在问题中标记。]

mktime64 与 jiffies 无关。它将其参数指定的日期转换为自 1970-01-01 00:00:00 以来的秒数(忽略闰秒)(如果参数用于 GMT,则从纪元开始的 Unix 时间)。

使用内核中的time64_to_tm 函数可以将返回的time64_t 值转换回年、月、日、小时、分钟、秒。它有这个原型:

void time64_to_tm(time64_t totalsecs, int offset, struct tm *result);

offset 参数是以秒为单位的本地时区偏移量(格林威治标准时间以东的秒数)。它应该设置为 0 以撤消由mktime64 完成的转换。

请注意,tm_year 成员设置为计算得出的年份减去 1900,tm_mon 成员设置为计算得出的月份减去 1,因此您可以按如下方式实现 unmktime64 函数:

void unmktime64(time64_t totalsecs,
                int *year, unsigned int *month, unsigned int *day,
                unsigned int *hour, unsigned int *minute, unsigned int *second)
{
    struct tm tm;

    time64_to_tm(totalsecs, 0, &tm);
    *year = tm.tm_year + 1900;
    *month = tm.tm_mon + 1;
    *day = tm.tm_mday;
    *hour = tm.tm_hour;
    *minute = tm.tm_min;
    *second = tm.tm_sec;
}

【讨论】:

  • 我在上面的代码中更正了对time64_to_tm 的调用,因为我错过了offset 参数。需要将偏移量设置为 0 以撤消 mktime64 的操作,因为它不使用本地时间偏移量。
  • 计算年份减去1900 - 代码加1900,什么是正确的?
  • @divMi 两者都是正确的。我的短语“calculated year minus 1900”是指time64_to_tm 的作用,而不是我的unmktime64 函数的作用。
猜你喜欢
  • 1970-01-01
  • 2019-03-20
  • 2016-03-03
  • 2012-01-18
  • 2016-09-20
  • 1970-01-01
  • 2021-08-31
  • 2013-01-30
相关资源
最近更新 更多