首页 > 其他分享 >C语言时间操作

C语言时间操作

时间:2022-11-22 22:35:49浏览次数:29  
标签:函数 int C语言 sttm tm 时间 time 操作


文章目录

  • ​​一、time_t别名​​
  • ​​二、time库函数​​
  • ​​三、tm结构体​​
  • ​​四、localtime库函数​​
  • ​​五、mktime库函数​​
  • ​​在这里插入图片描述 六、程序睡眠​​
  • ​​七、精确到微秒的计时器​​
  • ​​1、精确到微秒的timeval结构体​​
  • ​​2、时区timezone 结构体​​
  • ​​3、gettimeofday库函数​​
  • ​​八、应用经验​​
  • ​​九、课后作业​​
  • ​​十、获取视频教程​​
  • ​​十一、版权声明​​


UNIX操作系统根据计算机产生的年代和应用采用1970年1月1日作为UNIX的纪元时间,1970年1月1日0点作为计算机表示时间的是中间点,将从1970年1月1日开始经过的秒数用一个整数存放,这种高效简洁的时间表示方法被称为“Unix时间纪元”,向左和向右偏移都可以得到更早或者更后的时间。

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

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

一、time_t别名

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

typedef long time_t;

二、time库函数

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函数

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

三、tm结构体

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库函数

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

函数声明:

struct tm * localtime(const time_t *);

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

示例(book128.c)

/*
* 程序名:book128.c,此程序演示获取操作系统时间
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <time.h>

int main(int argc,char *argv[])
{
time_t tnow;
tnow=time(0); // 获取当前时间
printf("tnow=%lu\n",tnow); // 输出整数表示的时间

struct tm *sttm;
sttm=localtime(&tnow); // 把整数的时间转换为struct tm结构体的时间

// yyyy-mm-dd hh24:mi:ss格式输出,此格式用得最多
printf("%04u-%02u-%02u %02u:%02u:%02u\n",sttm->tm_year+1900,sttm->tm_mon+1,\
sttm->tm_mday,sttm->tm_hour,sttm->tm_min,sttm->tm_sec);

printf("%04u年%02u月%02u日%02u时%02u分%02u秒\n",sttm->tm_year+1900,\
sttm->tm_mon+1,sttm->tm_mday,sttm->tm_hour,sttm->tm_min,sttm->tm_sec);

// 只输出年月日
printf("%04u-%02u-%02u\n",sttm->tm_year+1900,sttm->tm_mon+1,sttm->tm_mday);
}

运行效果

C语言时间操作_c语言

五、mktime库函数

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

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

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

time_t mktime(struct tm *tm);

函数返回time_t的值。

示例(book130.c)

/*
* 程序名:book130.c,此程序演示时间操作的mktime库函数。
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <time.h>
#include <string.h>

int main(int argc,char *argv[])
{
// 2019-12-25 15:05:03整数表示是1577257503
struct tm sttm;
memset(&sttm,0,sizeof(sttm));

sttm.tm_year=2019-1900; // 注意,要减1900
sttm.tm_mon=12-1; // 注意,要减1
sttm.tm_mday=25;
sttm.tm_hour=15;
sttm.tm_min=5;
sttm.tm_sec=3;
sttm.tm_isdst = 0;
printf("2019-12-25 15:05:03 is %lu\n",mktime(&sttm));
}

运行效果

六、程序睡眠

在实际开发中,我们经常需要把程序挂起一段时间,可以使用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函数的返回值。

七、精确到微秒的计时器

1、精确到微秒的timeval结构体

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

struct timeval
{
long tv_sec; // 1970年1月1日到现在的秒。
long tv_usec; // 当前秒的微妙,即百万分之一秒。
};

2、时区timezone 结构体

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

struct timezone
{
int tz_minuteswest; // 和UTC(格林威治时间)差了多少分钟。
int tz_dsttime; // type of DST correction,修正参数据,忽略
};

3、gettimeofday库函数

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

函数声明:

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

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

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

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

示例(book132.c)

/*
* 程序名:book132.c,此程序演示精确到微秒的计时器。
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <sys/time.h> // 注意,不是time.h

int main()
{
struct timeval begin,end; // 定义用于存放开始和结束的时间

gettimeofday(&begin,0); // 计时器开始
printf("begin time(0)=%d,tv_sec=%d,tv_usec=%d\n",time(0),begin.tv_sec,begin.tv_usec);

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

gettimeofday(&end,0); // 计时器结束
printf("end time(0)=%d,tv_sec=%d,tv_usec=%d\n",time(0),end.tv_sec,end.tv_usec);

printf("计时过去了%d微秒。\n",\
(end.tv_sec-begin.tv_sec)*1000000+(end.tv_usec-begin.tv_usec));
}

运行效果

C语言时间操作_取值_02

各位,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格式返回
memset(strLocalTime,0,sizeof(strLocalTime));
LocalTime(strLocalTime,"yyyy-mm-dd hh24:mi:ss",0);

// 获取比现在晚10分钟的时间,以yyyy-mm-dd hh24:mi:ss格式返回
memset(strLocalTime,0,sizeof(strLocalTime));
LocalTime(strLocalTime,"yyyy-mm-dd hh24:mi:ss",10*60);

// 获取当前的时间,以hh24:mi:ss格式返回
memset(strLocalTime,0,sizeof(strLocalTime));
LocalTime(strLocalTime,"hh24:mi:ss",0);

十、获取视频教程

十一、版权声明

作者:码农有道

如果文章有错别字,或者内容有错误,或其他的建议和意见,请您留言指正,非常感谢!!!


标签:函数,int,C语言,sttm,tm,时间,time,操作
From: https://blog.51cto.com/u_13748800/5878568

相关文章

  • C语言获取系统错误
    文章目录​​一、strerror函数​​​​二、errno的细节​​​​1、调用库函数失败不一定会设置errno​​​​2、errno不能作为调用库函数失败的标志​​​​3、程序员可以不......
  • C语言编译预处理
    文章目录​​一、预处理指令​​​​二、包含文件​​​​三、宏定义指令​​​​1、无参数的宏​​​​2、带参数的宏​​​​四、条件编译​​​​1、#ifdef​​​​2、#i......
  • C语言gdb调试
    文章目录​​一、gdb的安装​​​​二、调试前的准备​​​​三、基本调试命令​​​​四、课后作业​​​​五、获取视频教程​​​​六、版权声明​​程序员写在编写程序......
  • C语言makefile文件
    文章目录​​一、makefile的编写​​​​二、make命令​​​​三、makefile文件中的变量​​​​四、应用经验​​​​五、课后作业​​​​六、获取视频教程​​​​七、版......
  • freecplus框架-MySQL数据库操作
    文章目录​​一、源代码说明​​​​二、概述​​​​三、connection类​​​​四、sqlstatement类​​​​五、程序流程​​​​1、无结果集SQL的程序的流程​​​​2、有......
  • freecplus框架-Oracle数据库操作
    文章目录​​一、源代码说明​​​​二、概述​​​​三、connection类​​​​四、sqlstatement类​​​​五、程序流程​​​​1、无结果集SQL的程序的流程​​​​2、有......
  • C语言数据类型
    文章目录​​一、基本类型​​​​1、字符型(char)​​​​2、整型(int)​​​​3、浮点型(float)​​​​二、字符串​​​​三、构造类型​​​​四、指针类型​​​​五、其它......
  • freecplus框架-文件操作
    文章目录​​一、源代码说明​​​​二、文件操作函数​​​​1、删除文件​​​​2、文件重命名​​​​3、复制文件​​​​4、获取文件的大小​​​​5、获取文件的时间......
  • freecplus框架-日志文件操作
    文章目录​​一、源代码说明​​​​二、日志文件的意义​​​​三、CLogFile类​​​​1、类的声明​​​​2、示例程序​​​​3、日志文件的切换​​​​四、获取视频教......
  • C语言学习笔记---static关键字
    1、static修饰局部变量在函数体内,只初始化一次,被static声明过的局部变量在调用过程中值不变。原因:在任意函数内定义局部变量,存储在线程中的栈区,出函数时自动摧毁,所以在每......