前面三种可以理解为元数据类型, 分别对应于: clock_t, time_t, tm.
而后面两种只是前三种类型的地域性表示.
第一种, Clock Tick(CPU时钟计时单元)
它是一种时间计量单位, 可以和秒进行换算.
clock_t clock_tick = clock(); // 表示程序运行以来到执行完该语句所耗费
的CPU时钟计时单元个数
long seconds = clock_tick / CLOCKS_PER_SECOND; // 换算为秒
第二种, Calender Time(日历时间)
它表示的是某一时间点距离原始时间点的秒数, 即它是以秒为单位的时间间隔.
而这个原始时间点, 不同的系统表示不同, 一般为1970年1月1日0时0分0秒, 而
在.Net2005中为1899年12月30日0时0分0秒.
// 表示当前时间点距离原始时间点的秒数
time_t calender_time = time(NULL);
// 辅助函数
// double difftime(time_t time2, time_t time1)
// 计算二者的秒数之差
第三种, Broken-down Time(分解时间)
它表示的是结构体, 成员包括年\月\日\时\分\秒(其他省略).
// 先得到当前的日历时间
time_t calender_time = time(NULL);
// 将日历时间转换为当前时区的分解时间
tm* local_time = localtime(&calender_time);
// 这里提到了当前时区的分解时间, 即本地时间. 因为日期时间
// 因时区的不同而各异,
// 例如: 北京位于东八区.
// 格林威治时间是统一的世界时间, 即上面提到的协调世界时间
// 这里将日历时间转换成格林威治式的分解时间
tm* utc_time = gmtime(&calender_time);
三种时间元类型给了我们很好的灵活性, 但也有值得注意的地方:
1. 可以直接获取当前的日历时间.
time_t calender_time = time(NULL);
2. 只能间接获取当前的分解时间, 借助localtime()函数进行转换
time_t calender_time = time(NULL);
tm* local_date = localtime(&calender_time);
3. 日历时间可以转化为日期的字符串表示
time_t calender_time;
// 赋值省略
char* szDate = ctime(calender_time);
4. 分解时间可以转化为日期的字符串表示
tm* date;
// 赋值省略
char* szDate = asctime(date);
5. 分解时间可以直接转换为日历时间
tm date;
// 赋值省略
time_t time = mktime(&date);
6. 日历时间可以转换为分解时间
time_t time;
// 赋值省略
tm* date = localtime(&time);
7. 分解时间可以格式化输出
// 借助strftime函数以及printf等函数