在使用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. */