Linux下时间的获取

目录

目录

一 如何获取时间

二 时间结构体

time_t

timeval结构体

 timezone结构体

tm结构体

三 时间获取用到的函数

1.time

 2.localtime

 3.ctime

 3.gettimeofday

四 演示

总结 


一 如何获取时间

想要知道现在的时间,首先需要一个时间标准表示0年0月0分。而这个时间标准已经被设置为1970年1月1日并延续至今。通过和时间标准对比我们可以得到一个时间段,通常以秒为单位表示这段时间。在C语言中,我们用time函数计算秒数,用time_t类型的数据表示秒数。接下来对这段时间时间也就是秒数进行模运算,以确定年份,月份等。一般来说,这里我们用localtime函数对秒数进行模运算,年份 月份等信息则被保存在tm结构体中。这一过程也被称为格式化输出,最后将获取的时间进行打印。

二 时间结构体

time_t

用来表示用1970年以来的秒数,是一个长整型的数据类型

timeval结构体

用来存储从1970年到现在经过了多少秒,精确到微秒

struct timeval
{
    long tv_sec; /*秒*/
    long tv_usec; /*微秒*/
};

 timezone结构体

 表示时区和夏令时信息

struct timezone {
    int tz_minuteswest;     /* minutes west of Greenwich */
    int tz_dsttime;         /* type of DST correction */
};

tm结构体

直接存储年月日的一个结构 

struct tm
{
    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;   /* Days in year.[0-365] */
    int tm_isdst;   /*日光节约时间的旗标DST. [-1/0/1]*/
};

三 时间获取用到的函数

1.time

函数原型:tm = time(NULL);
功能:获得1970年到现在的秒数
参数:t:存放秒数的空间首地址
返回值:成功返回1970年到现在的秒数,失败返回-1

 2.localtime

函数原型:struct tm *localtime(const time_t *timep);
功能:将一个秒数转化成日历时间
参数:timep:保存秒数空间的地址
返回值:成功返回保存日历时间结构体的指针,失败返回NULL

 3.ctime

函数原型:char *ctime(const time_t *timep);//date
功能:将时间秒数转化成字符串
参数:timep:保存时间空间的地址
返回值:成功返回获得时间字符串的首地址失败返回NULL

 3.gettimeofday

 函数原型:int gettimeofday(struct timeval *tv, struct timezone *tz);
功能:获取自1970年1月1日至今的秒数和为微秒数
参数:接收两个输出型参数
tv和tz ,返回一个int型的值
返回值:0操作成功,1操作失败

 注意:tz时区结构的使用是一个过时的设计,要求调用者在使用时将tz这个参数设置为NULL
测试发现,如果不设置为NULL,取到的tz的值是{0,0}

四 演示

 #include<stdio.h>
 #include<time.h>
 #include<string.h>
 #include<unistd.h>
int main()
{
    while(1)
    {
        time_t  demo_time;//定义一个time_t类型的变量demo_time,用来储存秒数
        demo_time = time(NULL);//对demo_time赋值,使它等于1970年1月1日0时0分0秒至当前时间的秒数


        struct tm* demo_time_struct;//定义一个tm类型结构体的指针,结构体用于储存年月日等信息
        demo_time_struct = localtime(&demo_time);//对demo_time_struct赋值,此时指针指向localtime函数产生的tm结构体
        printf("is localtime :%d-%02d-%02d %02d:%02d:%02d\n",demo_time_struct->tm_year + 1900,demo_time_struct->tm_mon + 1,demo_time_struct -> tm_mday,demo_time_struct ->tm_hour,
        demo_time_struct->tm_min,demo_time_struct->tm_sec);//显示结构体成员


        char * demo_time_char;//定义字符指针
        demo_time_char=ctime(&demo_time);//对demo_time_char赋值,指向ctime函数产生的字符串                    
        printf("is ctime:%s\n",demo_time_char);//显示字符串

        struct timeval demo_time_tv;//定义timeval的结构体,结构体两个成员:tv_sec(秒数)和tv_usec(微秒数)
        gettimeofday(&demo_time_tv, NULL);//gettimeofday函数获取当前时间,并返回结构体指针  
        printf("is gettimeofday:Seconds: %ld Microseconds: %ld\n", demo_time_tv.tv_sec, demo_time_tv.tv_usec);//显示结构体成员                  

        sleep(4);//延时4s进入下一次循环
    }
    return 0;
}

总结 

系统时间的获取总的来说可以分为这三步,获取秒数格式化输出打印时间

有趣的是,tm结构体中,tm_year表示的是距离1900年过去多少年,而不是直接存储1900年。在计算机发展的早期阶段,存储空间非常宝贵,存储和显示技术还不那么先进,将年份存储为两位十进制数是一种常见的做法。这一设定可以简化时间运算,有效地利用的硬件资源。但是这种做法也不可避免的引起了“千年虫”问题

在C语言标准中,把1970年作为初始时间,而tm结构体中的年份却是从1900年开始偏移。这是因为,早在C语言标准化之前,其他编程语言和早期的UNIX操作系统就已采用类似的方法处理年份。C语言的设计者为了保持与已有系统的兼容性,沿用了这一设定。这一设定也在一定程度上延缓了千年虫问题的出现,理解设定背后的逻辑可以帮助我们更好地利用这些函数,同时也提醒我们在面对新旧技术选择时考虑长远的影响和兼容性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值