Linux应用层时间函数

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: 从系统启动开始算起的单调增长时间,注意不包含suspend时间
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+1, 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+1, 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值