一、Linux时间类型
在Linux系统当中,时间分为两种类型:格林威治时间和日历时间。
Coordinated Universal Time(UTC)是世界标准的时间,即常说的格林威治标准时间(Greenwich Mean Time,GMT);UTC与GMT两者几乎是同一概念,都是指格林威治时间,只不过UTC的称呼更为正式一点。两者的区别是UTC是天文学上的概念,而GMT是基于一个原子钟。
Calendar Time是用“一个标准时间点(如1970年1月1日0点)到此时经过的秒数”来表示的时间,即日历时间;它与格林威治时间不同。
GMT是中央市区,北京在东8区,相差8个小时,所以北京时间=GMT时间+8小时。
++获取系统时间函数有:time()、gettimeofday();++
++设置系统时间函数有:stime()、settimeofday();++
二、Linux时间格式
2.1 time_t 时间类型
time_t类型定义在time.h中:
#ifndef __TIME_T
#define __TIME_T
typedef long time_t
#endif
可见,time_t实际是一个长整型。其值表示为从UTC(coordinated universal time)时间1970年1月1日00时00分00秒(也称为Linux系统的Epoch时间)到当前时刻的秒数。由于time_t类型长度的限制,它所表示的时间不能晚于2038年1月19日03时14分07秒(UTC)。为了能够表示更久远的时间,可用64位或更长的整型数来保存日历时间。
time_t类型的时间可以通过time()函数获取。
2.2 struct tm时间类型
struct tm结构在time.h中定义为:
#include <time.h>
struct tm {
int tm_sec; /* seconds */
int tm_min; /* minutes */
int tm_hour; /* hours */
int tm_mday; /* day of the month */
int tm_mon; /* month */
int tm_year; /* year */
int tm_wday; /* day of the week */
int tm_yday; /* day in the year */
int tm_isdst; /* daylight saving time */
};
ANSI C标准称使用tm结构的这种时间为分解时间(broken-down time)。其成员介绍如下:
- tm_sec:秒,取值区间为[0,59];
- tm_min:分,取值区间为[0,59];
- tm_hour:时,取值区间为[0,23];
- tm_mday:日期,取值区间为[1,31];
- tm_mon:月份,取值区间为[0,11];
- tm_year:年份,其值为1900年至今的年数;
- tm_wday:星期,取值区间为[0,6],0代表星期天,1代表星期一,以次类推;
- tm_yday:从年的1月1日开始的天数,取值区间为[0,365],0代表1月1日;
- tm_isdst:夏令时标识符,使用夏令时,tm_isdst为正;不使用夏令时,tm_isdst为0;不了解情况时,tm_isdst为负。
使用gmtime()和localtime()可将time_t时间类型转换为struct tm结构体;
使用mktime()可将struct tm结构体转换为time_t时间类型;
使用asctime()将struct tm转换为字符串形式。
2.3 struct timeval时间类型
struct timeval结构体在sys/time.h中定义如下:
#include <sys/time.h>
struct timeval {
time_t tv_sec; /* seconds:秒 */
suseconds_t tv_usec; /* microseconds:微妙 */
};
tv_sec是time_t时间类型,其值也表示为从UTC(coordinated universal time)时间1970年1月1日00时00分00秒(也称为Linux系统的Epoch时间)到当期时刻的秒数。
设置时间函数settimeofday()与获取时间函数gettimeofday()均使用该事件类型作为参数传递。
2.4 struct timespec时间类型
struct timespec结构体在time.h中定义为:
typedef long time_t;
struct timespec {
time_t tv_sec; /* seconds:秒 */
long tv_nsec; /* microseconds:纳妙 */
};
它是POSIX.4标准定义的时间结构,精确度到纳秒,一般由clock_gettime(clockid_t, struct timespec *)获取特定时钟的时间。常用如下4种时钟:
- CLOCK_REALTIME 统当前时间,从1970年1.1日算起
- CLOCK_MONOTONIC 系统的启动时间,不能被设置
- CLOCK_PROCESS_CPUTIME_ID 本进程运行时间
- CLOCK_THREAD_CPUTIME_ID 本线程运行时间
三、Linux时间编程接口
接下来介绍的时间编程函数接口均属于Linux系统调用函数。
3.1 time()函数
【函数原型】:
#include <time.h>
time_t time(time_t *tloc);
【函数说明】:
该函数用于获取日历时间,即从1970年1月1日0点到现在所经历的秒数。参数tloc通常设置为NULL,若tloc非空,time()函数也会将返回值存到tloc指针指向的内存中。
【返回值】:
该函数执行成功返回秒数,失败则返回((time_t)-1)值,错误原因存于errno中。
【使用例程】:
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t seconds = 0;
seconds = time((time_t *)NULL);
printf("seconds = %d\n",seconds);
return 0;
}
执行结果为:
seconds = 1434620150
通常用户得到日历时间的秒数没有实际的意义,但可以为时间转化做一些辅助性质的工作。为了更好的利用时间,用户需要将这些秒数转换为更易接受的时间表示方式ÿ