使用struct utimbuf更改文件访问时间

时间:2017-11-10 12:27:46

标签: c linux posix mktime time-t

我使用utimbuf将actime更改为当前时间 和modtime尝试更改为一个月后的时间

struct utimbuf timebuf;
timebuf.actime = time((time_t *)0);
timebuf.modtime = time((time_t *)0) + 2678400;

使用time()时,除了添加秒之外还有其他方法吗?

1 个答案:

答案 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. */