我使用utimbuf将actime更改为当前时间 和modtime尝试更改为一个月后的时间
struct utimbuf timebuf;
timebuf.actime = time((time_t *)0);
timebuf.modtime = time((time_t *)0) + 2678400;
使用time()时,除了添加秒之外还有其他方法吗?
答案 0 :(得分:0)
使用
time()
时,除了添加秒数之外还有其他方法吗?
当添加/减去你需要使用相同的单位时,秒数(你不只要计算你口袋里各种不同硬币的数量,看看你有多少钱,不要'你呢?)
如果懒得计算一分钟,一小时,一天的秒数,你可以编写一些函数或宏来编写代码:
#define SECONDS_PER_MINUTES(m) ((m)*60)
#define MINUTES_PER_HOURS(h) ((h)*60)
#define HOURS_PER_DAYS(d) ((d)*24)
您甚至可以重复使用
之类的内容#define SECONDS_PER_HOURS(h) (MINUTES_PER_HOURS(h) * SECONDS_PER_MINUTES(1))
#define SECONDS_PER_DAYS(d) (HOURS_PER_DAYS(d) * SECONDS_PER_HOURS(1))
使用上面的宏,您可以将time()
返回的时间添加2天,如下所示:
time_t = time(NULL) + SECONDS_PER_DAYS(2);
如果您将上述行传递给C pre-processor,那么您会看到它被转换为:
time_t = time(((void *)0)) + (((2)*24) * (((1)*60) * ((1)*60)));
这个(((2)*24) * (((1)*60) * ((1)*60))
是一个编译时常量,每次运行代码时都不会计算,但在编译期间只计算一次。
注意:NULL
这里的宏是一个膨胀,即:
#define NULL ((void *)0)
为了计算一个月或一年中的秒数,不幸的是,这不是那么简单,因为每月的天数变化,取决于月份和2月甚至月份所属的年份。
为了解决这个问题,请使用两个struct tm
初始化为适当的日期/时间并将其传递给mktime()
,以便在几秒钟内收到相关时间(自EPOCH以来)。
然后使用difftime()
来计算差异。
struct tm d1 = {0};
struct tm d2 = {0};
d1.tm_day = 1; /* day of month */
d1.tm_mon = 0; /* month - 1 */
d1.tm_year = 113 /* to specify 2013 == 1900+113 */
d2.tm_day = 1; /* day of month */
d2.tm_mon = 0; /* month - 1 */
d2.tm_year = 114 /* to specify 2014 == 1900+114 */
time_t t1 = mktime(d1);
time_t t2 = mktime(d2);
double d = difftime(d2, d1); /* number of seconds of year 2013. */