欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux API -- 时间函数

程序员文章站 2022-03-09 21:43:21
...

time时间函数

#include <time.h>

time_t time(time_t *ptr);

这个函数返回从UNIX新纪元( 1970年1月1日00:00:00 UTC )开始到现在经过的秒数,并且是按照UTC协调时间进行计算,统称为日历时间。它的精度是秒。

clock_gettime

#include <sys/time.h>

int clock_gettime(clockid_t clock_id, struct timespec *tsp);
int clock_settime(clockid_t clock_id, struct timespec *tsp);

返回值:正确返回0,出错返回-1

POSIX标准定义的时钟支持,clock_id可选择以下值:

CLOCK_REALTIME: 实时系统时间,和time功能一样,但是返回的时间值精度可能会更高
CLOCK_MONOTONIC: 不带负跳数的实时系统时间
CLOCK_PROCESS_CPUTIME_ID: 调用进程的CPU时间
CLOCK_THREAD_CPUTIME_ID: 调用线程的CPU时间

对应的时间结构体:

struct  timespec{
  time_t tv_sec; /*秒s*/  
  long tv_nsec; /*纳秒ns*/ 
};

gettimeofday

#include <sys/time.h>

int gettimeofday(struct timeval *restrict tp, struct timezone *gz);
int settimeofday(const struct timeval *tv, const struct timezone *gz);

这两个函数的实现依赖于平台,可能不具有一致性,有的平台tz只接受NULL为输入值,Linux平台支持传入时区,返回的是以距离UNIX新纪元开始计算到当前的时间值。和time一样,但是精度能达到微秒级别。
对应的时间结构体:

 struct timeval
 {
	int tv_sec;
	int tv_usec;
 }; 

转换

#include <time.h>

struct tm *gmtime(const time_t *calptr);
struct tm *localtime(const time_t *calptr);
time_t mktime(struct tm *tmptr);

gmtime是用于把日历时间转换为UTC时间的年、月、日、时、分、秒的分解结构体,localtime用于把日历时间转换为本地时间的分解结构体,和gmtime相比,考虑了本地时区和夏令时标志进行的转换。
mktime是把本地时间转换为日历时间的函数,一定注意的是必须是本地分解时间,它相当于localtime的逆过程。

分解时间的结构体:

struct tm {
	int tm_sec;
	int tm_min;
	int tm_hour;
	int tm_mday;
	int tm_mon;
	int tm_year;  //从1900开始算起,因此要加1900得出实际年份
	int tm_wday;
	int tm_yday;
	int tm_isdst;
};

示例:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>

static void show_time_t(void)
{
	time_t now;

	now = time(NULL);
	printf("time_t now: %ld\n",(long) now);
}

static void show_timeval(void)
{
	struct timeval tv;
	int ret;

	gettimeofday(&tv, NULL);
	printf("timeval.tv_sec:%ld  timeval.tv_usec:%ld\n",
			(long)tv.tv_sec, (long)tv.tv_usec);
}

static void show_timespec(void)
{
	struct timespec ts;

	clock_gettime(CLOCK_REALTIME, &ts);
	printf("timespec.tv_sec:%ld  timespec.tv_nsec:%ld\n",
			(long)ts.tv_sec, (long)ts.tv_nsec);
}

static void show_utc_time(void)
{
	struct tm *gm;
	time_t now;

	now = time(NULL);
	gm = gmtime(&now);
	printf("UTC:%d-%d-%d %d:%d:%d\n",
			1900+gm->tm_year, gm->tm_mon, gm->tm_mday,
			gm->tm_hour, gm->tm_min, gm->tm_sec);

}

static void show_localtime(void)
{
	struct tm *gm;
	time_t now;

	now = time(NULL);
	gm = localtime(&now);
	printf("LOCAL:%d-%d-%d %d:%d:%d\n",
			1900+gm->tm_year, gm->tm_mon, gm->tm_mday,
			gm->tm_hour, gm->tm_min, gm->tm_sec);

}

int main(int argc, char *argv[])
{
	show_time_t();
	show_timeval();
	show_timespec();
	show_utc_time();
	show_localtime();
	exit(0);
}

运行结果如下:

$ ./time 
time_t now: 1553755961
timeval.tv_sec:1553755961  timeval.tv_usec:903515
timespec.tv_sec:1553755961  timespec.tv_nsec:903521280
UTC:2019-2-28 6:52:41
LOCAL:2019-2-28 14:52:41