Linux的时间函数
格林威治时间表示0时区的标准时间。其他时区的时间和此标准时间均有时间差。UTC(Universal TimeCoordinated)是世界协调时间,是格林威治时间在互联网中的表示方法
二、标准C语言时间函数
1、time(取得本地目前的时间秒数)
#include <time.h>
time_t time(time_t *t);
函数说明
返回值
time_t 定义为long int
范例
mian()
{
long int seconds=time((time_t*)NULL);
printf(“%d\n”,seconds);
}
执行
2、gmtime(根据本地时间取得目前的UTC时间)
#include <time.h>
struct tm*gmtime(consttime_t*timep);
函数说明
结构tm的定义为
struct tm
{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
int tm_sec 代表目前秒数,正常范围为0-59,但允许至61秒
int tm_min 代表目前分数,范围0-59
int tm_hour 从午夜算起的时数,范围为0-23
int tm_mday 目前月份的日数,范围01-31
int tm_mon 代表目前月份,从一月算起,范围从0-11
int tm_year 从1900 年算起至今的年数
int tm_wday 一星期的日数,从星期一算起,范围为0-6
int tm_yday 从今年1月1日算起至今的天数,范围为0-365
int tm_isdst 日光节约时间的旗标
此函数返回的时间日期未经时区转换,而是UTC时间。
返回值
范例
main(){
char*wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
time_t timep;
struct tm *p;
time(&timep);
p=gmtime(&timep);
printf(“%d%d%d”,(1900+p->tm_year),(1+p->tm_mon),p->tm_mday);
printf(“%s%d;%d;%d\n”,wday[p->tm_wday], p->tm_hour, p->tm_min,p->tm_sec);
}
执行
3、localtime(取得当地目前UTC时间和日期)
#include
struct tm *localtime(const time_t *timep);
函数说明
返回值
范例
main(){
char*wday[]={“Sun”,”Mon”,”Tue”,”Wed”,”Thu”,”Fri”,”Sat”};
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep);
printf (“%d%d%d ”,(1900+p->tm_year),( l+p->tm_mon), p->tm_mday);
printf(“%s%d:%d:%d\n”,wday[p->tm_wday],p->tm_hour, p->tm_min, p->tm_sec);
}
执行
4、ctime(将时间和日期以字符串格式表示)
#include
char *ctime(const time_t *timep);
函数说明
返回值
范例#include <time.h>
main()
{
time_t timep;
time (&timep);
printf(“%s”,ctime(&timep));
}
执行
5、asctime(将时间和日期以字符串格式表示)
#include <time.h>
char * asctime(const struct tm *timeptr);
函数说明
返回值
附加说明
范例#include <time.h>
main()
{
time_t timep;
time (&timep);
printf(“%s”,asctime(gmtime(&timep)));
}
执行
6、mktime(将时间结构数据转换成经过的秒数)
#include <time.h>
time_t mktime(strcut tm * timeptr);
函数说明
返回值
范例
#include <time.h>
main()
{
time_t timep;
strcut tm *p;
time(&timep);
printf(“time() : %d \n”,timep);
p=localtime(&timep);
timep = mktime(p);
printf(“time()->localtime()->mktime():%d\n”,timep);
}
执行
time()->localtime()->mktime():974943297
设置系统时间
标准C库中只有获取系统时间的API,好像还没有设置系统时间的API,本文将谈谈如何在linux和windows平台设置系统时间,最后给出一个与平台无关的设置系统时间的封闭函数。
Linux下设置系统时间:
1.Linux下设置系统时间的函数有好几个,先来看看最常用的stime()函数,这个函数只能精确到秒。
#define _SVID_SOURCE
#include <time.h>
int stime(time_t *t);
参数说明:
t是以秒为单位的时间值,从GMT1970年1月1日0时0分0秒开始计算。
返回值:
成功返回0,错误返回-1,errno错误码,EFAULT表示传递的参数错误,如时间值是无效的值,EPERM表示权限不够,注意只有root用户才有修改系统时间的权限。如果要让普通程序修改系统时间,可以先切换到root用户操作,修改完成后,再切换到普通用户,或者用命令chmod+s给执行文件加上root用户的权限。
2.linux是如何管理时间的?
在系统启动时,Linux操作系统将时间从CMOS中读到系统时间变量中,以后修改时间通过修改系统时间实现。为了保持系统时间与CMOS时间的一致性,Linux每隔11分钟会将系统时间写入CMOS,同步时间。从这可以看出,获取系统时间有两个途径,一种是从CMOS中读,一种是从系统中读,但修改时间却只有一种,即修改linux系统中的时间,而修改CMOS中的时间是无效的,因为CMOS中的时间会被定时重写掉。另外还有一点要注意,修改了系统时间并不是马上生效的,假如你修改了系统时间并马上关机,再开机的时候,时间还是原来的,因为修改的时间还没有来得及写入CMOS中。
3.通过settimeofday()函数来设置系统时间,这个函数设置的精度可以精确到微秒。
#include <time.h>
int settimeofday(const struct timeval *tv , const structtimezone *tz);
struct timeval {
};
struct timezone {
};
tz参数为时区,时区结构中tz_dsttime在linux中不支持,应该置为0,通常将参数tz设置为NULL,表示使用当前系统的时区。该函数是glib中的,但在mingw中没有实现。
该函数返回值与stime()一样,同样也需要root权限。
4.设置CMOS时间,其实它是通过RTC(Real-time clock)设备驱动来完成的,你可以用ioctl()函数来设置时间,当然也可以通过操作/dev/rtc设备文件,在此就不详细说明了。
二、windows下设置系统时间
1.设置当前时区的时间
#include <time.h>
BOOL SetLocalTime(const SYSTEMTIME*lpSystemTime);
typedef struct _SYSTEMTIME {
}SYSTEMTIME;
函数成功返回非零,失败返回零。注意要求调用进程必需有SE_SYSTEMTIME_NAME权限。
2.另外还有一个函数SetSystemTime(),它的参数与SetLocalTime一样,只不过以UTC时区为基准的。
BOOL SetSystemTime(const SYSTEMTIME*lpSystemTime);
二、一个封装的设置系统时间的函数
//设置成功返回true,否则返回false
{
#ifdef _WIN32
#endif
}
三、linux系统时间函数
1、gettimeofday(取得目前的时间)
#include <time.h>
int gettimeofday ( struct timeval * tv, struct timezone * tz )
函数说明
timeval结构定义为:
struct timeval{
long tv_sec;
long tv_usec;
};
timezone 结构定义为:
struct timezone{
int tz_minuteswest;
int tz_dsttime;
};
上述两个结构都定义在/usr/include/sys/time.h。tz_dsttime 所代表的状态如下
DST_NONE
DST_USA
DST_AUST
DST_WET
DST_MET
DST_EET
DST_CAN
DST_GB
DST_RUM
DST_TUR
DST_AUSTALT
返回值
main(){
struct timeval tv;
struct timezone tz;
gettimeofday (&tv , &tz);
printf(“tv_sec; %d\n”, tv,.tv_sec);
printf(“tv_usec; %d\n”,tv.tv_usec);
printf(“tz_minuteswest; %d\n”,tz.tz_minuteswest);
printf(“tz_dsttime,%d\n”,tz.tz_dsttime);
}
执行
tv_usec:136996
tz_minuteswest:-540
tz_dsttime:0
2、settimeofday(设置目前时间)
int settimeofday ( const struct timeval*tv,const struct timezone *tz);
函数说明
返回值
错误代码
EINVAL 时区或某个数据是不正确的,无法正确设置时间。
3、clock_gettime(获取指定时钟的时间值)
int clock_gettime( clockid_tclock_id,struct timespec * tp );
说明:clock_id指定要获取时间的时钟,根据Posix的指定可以是以下值:
CLOCK_REALTIME
Systemwide realtime clock.
CLOCK_MONOTONIC
Represents monotonic time. Cannot beset.
CLOCK_PROCESS_CPUTIME_ID
High resolution per-process timer.
CLOCK_THREAD_CPUTIME_ID
Thread-specific timer.
CLOCK_REALTIME_HR
High resolution version ofCLOCK_REALTIME.
CLOCK_MONOTONIC_HR
High resolution version ofCLOCK_MONOTONIC.
struct timespec {
time_ttv_sec;
long
};
4、adjtimex(tune kernel clock)
int adjtimex(struct timex *buf);
说明:
Linux
struct timex {
intmodes;
longoffset;
longfreq;
longmaxerror;
longesterror;
intstatus;
longconstant;
longprecision;
longtolerance;
struct timeval time;
longtick;
};
The modes field determines whichparameters, if any, to
#defineADJ_OFFSET
#defineADJ_FREQUENCY
#defineADJ_MAXERROR
#defineADJ_ESTERROR
#defineADJ_STATUS
#defineADJ_TIMECONST
#defineADJ_TICK
#define ADJ_OFFSET_SINGLESHOT 0x8001
Ordinary users are restricted to a zerovalue for mode.
RETURN VALUE
On success, adjtimex() returns theclock state:
#defineTIME_OK
#define TIME_INS
#define TIME_DEL
#define TIME_OOP
#define TIME_WAIT 4
#define TIME_BAD
On failure, adjtimex() returns -1 andsets errno.
ERRORS
EFAULT
buf does not point to writablememory.
EINVAL
An attempt is made to set buf.offset toa value outside the range -131071 to +131071, or to set buf.statusto a value other than those listed above, or to set buf.tick to avalue outside the range 900000/HZ to 1100000/HZ, where HZ is thesystem
EPERM
buf.mode is non-zero and the callerdoes not have sufficient privilege.Under Linux the CAP_SYS_TIMEcapability is required.
CONFORMING TO
adjtimex() is Linux specific and shouldnot be used in programs intended to be portable. See adjtime(3) fora more portable, but less flexible, method of adjusting the systemclock.