【问题标题】:Using struct utimbuf to change file access time使用 struct utimbuf 更改文件访问时间
【发布时间】:2018-04-23 16:24:22
【问题描述】:

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

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

在使用time()的时候,除了加秒还有其他方法吗?

【问题讨论】:

  • cur_t.actime 不报错?
  • 你为什么要将你的标题恢复为一个更短的标题,它只说明你的问题/问题是什么,而只是它所关注的模糊区域?发布标题为“使用事物 X”的问题没有用处,因为它没有描述问题,否则可能会识别出您的确切问题的人可能会因为无趣、模糊的标题而滚动过去。

标签: c linux posix mktime time-t


【解决方案1】:

在使用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))

使用上面的宏,您可以将 2 天添加到 time() 返回的时间,如下所示:

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)

不幸的是,计算一个月或一年中的秒数并不是那么简单,因为每个月的天数会有所不同,具体取决于月份和二月,甚至是该月所属的年份。

要解决此问题,请使用两个 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. */

【讨论】:

    猜你喜欢
    • 2017-03-30
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2017-06-08
    • 2012-07-06
    • 1970-01-01
    • 2013-11-02
    相关资源
    最近更新 更多