用C语言操纵时间,你造吗?

C语言

​在实际开发中,对日期和时间的操作需求非常多,例如程序启动和退出的时间,程序执行任务的时间,数据生成的时间,数据处理的各环节的时间等,无处不在。

在学习时间之前,请把操作系统的时区设置为中国北京或上海时间。

在C语言中,用time_t来表示时间数据类型,它是一个long(长整数)类型的别名,在time.h文件中定义,表示一个日历时间,是从1970年1月1日0时0分0秒到现在的秒数。

typedef long time_t;

可以看出time_t其实是一个长整型。

time函数的用途是返回一个值,也就是从1970年1月1日0时0分0秒到现在的秒数。

time函数是C语言标准库中的函数,在time.h文件中声明。

time_t time(time_t *t);

time函数有两种调用方法:

time_t tnow;

tnow =time(0); // 将空地址传递给time函数,并将time返回值赋给变量tnow

time(&tnow); // 将变量tnow的地址作为参数传递给time函数

各位可以写代码测试一下这两种方式,效果完全相同。

time_t只是一个长整型,不符合我们的使用习惯,需要转换成可以方便表示时间的结构体,即tm结构体,tm结构体在time.h中声明,如下:

struct tm

{

int tm_sec; /* 秒 – 取值区间为[0,59] */

int tm_min; /* 分 - 取值区间为[0,59] */

int tm_hour; /* 时 - 取值区间为[0,23] */

int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */

int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */

int tm_year; /* 年份,其值等于实际年份减去1900 */

int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */

int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */

int tm_isdst; /* 夏令时标识符,该字段意义不大,我们不用夏令时。 */

};

这个结构定义了年、月、日、时、分、秒、星期、当年中的某一天、夏令时。用这个结构体可以很方便的显示时间。

localtime函数用于把time_t表示的时间转换为struct tm表示的时间,函数返回struct tm结构体的地址。

函数声明:

struct tm * localtime(const time_t *);

struct tm结构体包含了时间的各要素,但还不是我们习惯的时间表达方式,我们可以用格式化输出printf、sprintf或fprintf等函数,把struct tm结构体转换为我们想要的结果。

示例(book128.c)

C语言

输出结果

C语言

mktime函数的功能与localtime函数相反。

localtime函数用于把time_t表示的时间转换为struct tm表示的时间。

mktime 函数用于把struct tm表示的时间转换为time_t表示的时间。

函数返回time_t的值。

time_t mktime(struct tm *tm);

示例(book130.c)

C语言

运行结果

C语言

在实际开发中,我们经常需要把程序挂起一段时间,可以使用sleep和usleep两个库函数,需要包含unistd.h头文件中。函数的声明如下:

unsigned int sleep(unsigned int seconds);

int usleep(useconds_t usec);

sleep函数的参数是秒,usleep函数的参数是微秒,1秒=1000000微秒。

sleep(1); // 程序睡眠1秒。

sleep(10); // 程序睡眠10秒。

usleep(100000); // 程序睡眠十分之一秒。

usleep(1000000); // 程序睡眠一秒。

程序员不关心sleep和usleep函数的返回值。

timeval结构体在sys/time.h文件中定义,声明为:

struct timeval

{

    long  tv_sec;            // 1970年1月1日到现在的秒。

    long  tv_usec;         // 当前秒的微妙,即百万分之一秒。

};

timezone 结构体在sys/time.h文件中定义,声明为:

struct timezone

{

int tz_minuteswest; // 和greenwich 时间差了多少分钟。

int tz_dsttime; // type of DST correction。

}

gettimeofday是获得当前的秒和微秒的时间,其中的秒是指1970年1月1日到现在的秒,微秒是指当前秒已逝去的微秒数,可以用于程序的计时。调用gettimeofday函数需要包含sys/time.h头文件。

函数声明:

int gettimeofday(struct timeval *tv, struct timezone *tz )

当前的时间存放在tv 结构体中,当地时区的信息则放到tz所指的结构中。

函数执行成功后返回0,失败后返回-1。

在使用gettimeofday()函数时,第二个参数一般都为空,我们一般都只是为了获得当前时间,不关心时区的信息。

示例(book132.c)

C语言

运行结果

C语言

各位,book132.c程序采用usleep睡眠十分之一秒,但是计时器显示的实际时间大于十分之一秒,为何?原因很简单,因为程序执行需要时间,虽然这个时间很短,在千分之一秒内,那也是需要时间。

还有一个要注意的问题,time.h 是ISO C99 标准日期时间头文件。sys/time.h 是Linux 系统的日期时间头文件,也就是说,timeval、timezone结构体和gettimeofday函数在windows平台中不能使用。

在实际开发中,除了当前的时间,还经常需要一个偏移量的时间,例如获取十分钟之后的时间,做法是采用time函数得到一个整数后,再加上10*60秒,再用localtime函数转换为结构体。

继续丰富你的函数库。

1、把整数的时间转换为字符串格式的时间,格式如:“2019-02-08 12:05:08”,如果转换成功函数返回0,失败返回-1,函数的声明如下:

int timetostr(const time_t ti,char *strtime);

2、把字符串格式的时间转换为整数的时间,函数的声明如下:

int strtotime(const char *strtime,time_t *ti);

3、获取操作系统的时间,函数的声明如下:

void LocalTime(char *out_stime,const char *in_fmt,const int in_interval);

out_stime是输出结果,格式由fmt决定。

in_interval是偏移常量,单位是秒。

in_fmt指定了out_stime的格式,取值如下:

yyyy-mm-dd hh24:mi:ss

yyyymmddhh24miss

yyyy-mm-dd

yyyymmdd

hh24:mi:ss

hh24miss

hh24:mi

hh24mi

hh24

mi

调用示例:

 char strLocalTime[21];

// 获取当前的时间,以yyyy-mm-dd hh24:mi:ss格式返回

LocalTime(strLocalTime,“yyyy-mm-dd hh24:mi:ss”,0);

// 获取比现在晚10分钟的时间,以yyyy-mm-dd hh24:mi:ss格式返回

LocalTime(strLocalTime,“yyyy-mm-dd hh24:mi:ss”,10*60);

// 获取当前的时间,以hh24:mi:ss格式返回

LocalTime(strLocalTime,“hh24:mi:ss”,0);

C语言

小编精心整理了C语言资料一份—点击这里免费领取

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值