几个概念
- time_t:time since epoch,是一个抽象的时间,它究竟是怎么存储的,C语言标准并没有对其进行定义。虽然大部分编译器实现都是用一个整型变量存储秒数,从UTC epoch开始。
- tm:是一个具体表达日历时间的结构体,它包含了年月日时分秒。
- UNIX time:UNIX系统时间,它的epoch和UTC是相同的,但是并没有考虑闰秒,所以,UNIX时间和UTC时间是不相同的。
- tm中的“daylight saving time”:也就是夏令时,一种为了节约照明电力专门设计的时间,每年春季时钟拨快1小时,秋季回调1小时。
tm类型与make_time()函数
tm是一个结构体,包含了日历时间所需要的所有分成:年、月、日、时、分、秒
Member | Type | Meaning | Range |
tm_sec | int | seconds after the minute | 0-60* |
tm_min | int | minutes after the hour | 0-59 |
tm_hour | int | hours since midnight | 0-23 |
tm_mday | int | day of the month | 1-31 |
tm_mon | int | months since January | 0-11 |
tm_year | int | years since 1900 | |
tm_wday | int | days since Sunday | 0-6 |
tm_yday | int | days since January 1 | 0-365 |
tm_isdst | int | Daylight Saving Time flag | |
日期加上秒数得到新的日期
#include <ctime>
#include <cstdio>
int main(){
time_t epoch = 0;
time_t t1 = epoch + 1606785706;
struct tm *ptm = gmtime(&t1);
printf("date:%d,%d,%d\n", ptm->tm_year, ptm->tm_mon, ptm->tm_mday);
}
输出为:
注意,tm.tm_year以1900年为起点,也就是公元2020年,1606785706这个秒数本身是从1970年1月1日0时0分0秒开始计算的。 另外,tm.mon的编码区间是[0,11],所以tm.mon=11表示的是12月。 最后,这个日期和时间,实际上是Unix时间,它和UTC共用一个epoch,但是并没有考虑闰秒,而UTC是考虑了闰秒的。
计算两个日期之间的秒数
#include <stdio.h>
#include <time.h>
int main ()
{
time_t timer;
struct tm y2k = {0};
double seconds;
y2k.tm_hour = 0; y2k.tm_min = 0; y2k.tm_sec = 0;
y2k.tm_year = 100; y2k.tm_mon = 0; y2k.tm_mday = 1;
time(&timer);
seconds = difftime(timer,mktime(&y2k));
printf ("%.f seconds since January 1, 2000 in the current timezone", seconds);
return 0;
}