自学内容网 自学内容网

Linux 基础入门操作 - 第六章时间操作

6 系统的时间操作

6.1 时间定义

6.1.1 日历时间

它是指以某个标准时间点为基点到现在时刻的秒数,一般以1970.1.1零点为起点,这是最最基础的计量方式,有了这个基础数据,其它标准时间,本地时间便可轻松转化出来了.这个日历时间可通过系统调用time()来获取到。

譬如: 2024-10-06 15:30:45 特定的日期和时间,人类可读的时间表示,而且通常与时区相关联

C语言中可以通过 struct tm 结构体表示日历时间,成员包括 tm_year(年)、tm_mon(月)、tm_mday(日)等:

struct tm {
    int tm_sec;   // 秒
    int tm_min;   // 分
    int tm_hour;  // 时
    int tm_mday;  // 天
    int tm_mon;   // 月
    int tm_year;  // 年
    int tm_wday;  // 星期几
    int tm_yday;  // 一年中的第几天
    int tm_isdst; // 是否夏令时
};

应用场景:
日常生活中常用的日期和时间。
用于显示给用户的时间格式。
如日历应用、电子邮件、文件创建时间等。

6.1.2 世界标准时间,即格林威治标准时间,它可以通过系统调用gmtime()方法来由日历时间转换而来。

UTC 通常以 24 小时制表示,不附带时区信息。时间格式通常为 YYYY-MM-DD HH:MM:SS UTC 或者带有 Z 后缀(Z 代表零时区,UTC+00:00)

譬如:

2024-10-06T12:30:45Z 表示世界标准时间的 12:30:45

应用场景:

用于全球统一的时间标识,避免时区转换问题。
应用于网络协议、数据库时间戳、分布式系统、航空航天和其他需要精确同步时间的系统。例如,服务器日志、区块链交易时间、国际航班时间表等

6.1.3 本地时间,即按当前所处时区来表示的本地时间,它也可以通过系统调用localtime()方法来由日历时间转换而来。

本地时间是指根据本地时区计算出的时间,通常会受时区和**夏令时(DST)**的影响。它与 UTC 时间有固定的偏移量,该偏移量取决于所在的地理位置。

在本地环境中显示时间,符合用户的时区习惯。
应用于手机、电脑、服务器、智能家居设备等需要显示当地时间的设备。
例如,日程安排、提醒通知、航班起飞时间。

总结:
日历时间:基于年、月、日的表示,是人类可读的时间形式。
UTC 时间:全球统一的时间基准,不受时区影响,适合全球同步的场景。
本地时间:受时区和夏令时影响,是根据本地时区计算的时间,适合本地用户的使用习惯。

6.2 接口函数介绍

c语言的头文件位置

#include <time.h>

常见的api的函数


 1. time_t time(time_t *local) 
 2. struct tm *gmtime(const time_t *timep) 
 3. struct tm *localtime(const time_t *timep) 
 4. char * asctime(const struct tm *p) 
 5. char *ctime(const time_t *timep) 
 6. int gettimeofday(struct timeval *tv, struct timezone *tz) 
 7. unsigned int sleep(unsigned int seconds):nsigned alarm(unsigned seconds);

6.2.1 获取日历时间

time_t time(time_t *tloc)

获取日历时间,即从1970年1月1日0点到现在所经历的秒数

6.2.2 日历时间转换为格林威治标准时间和本地时间

struct tm *gmtime(const time_t *timep)

将日历时间转化为格林威治标准时间,并保存在tm结构

struct tm* localtime(const time_t *timep)

函数功能:将日历时间转化为本地时间,并保存至tm结构

6.2.3 显示时间

函数gmtime()、localtime()可以将日历时间转化为格林威治时间和本地时间,虽然用户可通过结构体tm来获取这些时间值,但看起来还不方便,最好是将所有的信息,如年、月、日、星期、时、分、秒以字符串的形式显示出来。

char *asctime(const struct tm *tm)

函数功能:将tm格式的时间转化为字符串

char *ctime(const time_t *timep)

将日历时间转化为本地时间的字符串形式

6.2.4 计算事件耗时

int gettimeofday(struct timeval *tv, struct timezone *tz);
// 计算时间差,单位毫秒
int elapsed_time(struct timeval *ct, struct timeval *lt)
{
int elapsed = (ct->tv_sec - lt->tv_sec) * 1000 + (ct->tv_usec - lt->tv_usec) / 1000;
return elapsed;
}

6.2.5 延时函数

unsigned int sleep(unsigned int seconds)  // 延时秒
void usleep(unsigned long usec)      // 演示多少微秒

6.2.6 定时器

unsigned alarm(unsigned seconds);

6.3 参考代码

6.3.1 案例代码

#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>
#include <signal.h>

/* 检查执行程序时是否输入参数 */
int check_parameter(char *p )
{
        if(p == NULL) {
                printf("parameter error\n");
                printf("Please Enter Parameter'sec'or'tm' or 'string_time' or 'usetime' or 'alarm'\n");
                return -1;
        }
        return 0;
}

/*被测试运行时间的一段程序*/
int test_function()
{
        int i,j;
        double y;
        for(i = 0;i < 1000;i++)
                for(j = 0;j < 1000;j++)
                        y++;
        return 0;
}

/*使用alarm()函数延时5秒后执行的程序*/
void alarm_handler(int signum)
{
        printf("Five seconds passed\n");

}

/*延时函数*/
void func(void)
{
        signal(SIGALRM,alarm_handler);
        alarm(5);
        pause();

}
/*主函数*/
int main( int argc,char *argv[])
{

       Const char *const days[] =                //定义星期数组常量
{"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

time_t sec = 0;                            //定义日历时间变量
        struct tm *ltime;                         //定义tm类型时间变量
        struct timeval tv1,tv2; 
        float  timeuse;  

        /*调用check_parameter()函数检查参数输入情况,若没有参数输入,则终止程序*/
        if(check_parameter(argv[1]))  
                return -1;

        sec = time(NULL);                          //获取日历时间,单位秒

        /* 若输入参数为”sec”,则输出日历时间,单位为秒*/
        if(strcmp(argv[1],"sec") == 0)           
                printf("sec = %d\n",sec);

/* 若输入参数为”tm”,则输出tm格式时间*/
        if(strcmp(argv[1],"tm") == 0) {
                ltime=localtime(&sec);//获取本地时间,tm类型
                printf(" localtime is :%d year %d month %d day %s %d:%d:%d\n ",
ltime -> tm_year + 1900,ltime -> tm_mon + 1,ltime -> tm_mday,days[ltime -> tm_wday],ltime -> tm_hour,ltime -> tm_min,ltime -> tm_sec);
                ltime = gmtime(&sec);//获取UTC 时间,tm类型
                printf("UTC time is  :%d year %d month %d day %s %d:%d:%d\n ",ltime -> tm_year + 1900,ltime -> tm_mon + 1,ltime -> tm_mday,days[ltime -> tm_wday],ltime -> tm_hour,ltime -> tm_min,ltime -> tm_sec);

        }

/*输出一串字符串表示的时间*/
if(strcmp(argv[1],"string_time") == 0){      
                printf("local time is:%s\n",ctime(&sec));
                printf("UTC  time  is:%s\n",asctime(gmtime(&sec)));
        }

/*  计算函数执行消耗的时间   */
        if(strcmp(argv[1],"usetime") == 0){    
                gettimeofday(&tv1,NULL);               //获取函数执行前的时间
                test_function();                         //执行函数
                gettimeofday(&tv2,NULL);               //获取函数执行后的时间
                /*计算时间差单位为微秒*/
                timeuse = 1000000 * (tv2.tv_sec - tv1.tv_sec) + tv2.tv_usec - tv1.tv_usec;
                timeuse /= 1000000;                     //将时间转换为妙
                printf("used time is:%f (s) \n",timeuse);      
        }
/* 延时函数的使用*/
        if(strcmp(argv[1],"alarm") == 0){
                func();                              //调用延时函数,5秒后执行函数alarm_handler()
        }
        return 0;

}

6.3.2 运行结果演示


原文地址:https://blog.csdn.net/huanghongqi11/article/details/142726707

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!