gpt4 book ai didi

time_t 的自定义时间结构

转载 作者:太空宇宙 更新时间:2023-11-04 01:54:52 28 4
gpt4 key购买 nike

在我当前的项目中,我有一个 C 结构来保存时间戳,如下所示:

struct timestamp {
uint16_t year;
uint8_t month;
uint8_t day;
uint8_t hour;
uint8_t min;
uint8_t second;
}

现在我想以秒为单位计算其中两个时间戳之间的差异。现在我正在将我的时间戳结构转换为 C 标准结构 struct tm (在 <time.h> 中定义)。然后我将结构转换为 time_tmtkime() , 它接受一个指向 struct tm 的指针并返回 time_t .和 difftime()计算两者之间的差异time_t以秒为单位。

我不想自己写difftime() ,因为我不想自己处理闰年或更糟的闰秒,而且我不使用 struct tm在我的代码中,因为它包含很多我不经常需要的值(例如工作日或年日)。

这是一个例子,我现在正在做的事情:

void customTimestampToStructTM(struct customTimestamp *in, struct tm *out) {
out->tm_year = in->year;
out->tm_mon = in->mon;
out->tm_mday = in->day;
out->tm_hour = in->hour;
out->tm_min = in->min;
out->tm_sec = in->sec;
}

void someFunction() {
struct customTimestamp c1;
struct customTimestamp c2;
// Fill c1 and c2 with data here.

struct tm tmpC1;
struct tm tmpC2;

customTimestampToStructTM(&c1, &tmpC1);
customTimestampToStructTM(&c2, &tmpC2);

double diffInSeconds = difftime(mktime(tmpC1), mktime(tmpC2));
// Use diffInSeconds
}

这行得通,但效率似乎低得令人难以置信。我怎样才能加快速度?我读了heremktime不使用 struct tm 中的其他字段- 除了 isdst .有没有方便的方法将 my 结构转换为 time_t , 不使用 struct tm作为一座桥梁,无需处理闰年/秒?

澄清: time_t保存自特定日期(1970 年 1 月 1 日)以来经过的毫秒数的日期。

最佳答案

mktime [和 localtime] 对于所有边缘情况都是重要的。它们也经过高度优化,因此您不太可能在速度方面做得更好。

因此,只需使用它们[快速填充(例如)您已经在做的 struct tm temp]。

但是,加速是将 time_t tod 添加到您的结构中。当您创建结构时,从 mktime 一次 填充它。这可以节省对 mktime 的许多重复/重复调用。

您甚至可以延迟 mktime 调用(即只有您的一些结构可能需要它)。将 tod 设置为标记值(例如 -2)。当你真正需要使用tod时,如果tod是sentinel值,则从mktime填充

关于time_t 的自定义时间结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35998630/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com