计算机中的时间.

计算机中的时间.

时间是什么概念? 这个好像不用多说,但又耐人寻味.
计算机中的时间,首先要表示清楚当前时间.
当前时间, 在c 语言中有3中表示方法.
1. 用长整数表示.,表示从格林威治0时间到现在的秒数. 这用time()就能得到
2. 用struct timeval 表示,它表示从格林威治0时间到现在的秒数和微秒数,精度提高了,用gettimeofday函数得到
3. 用分割的时间结构struct tm 结构来表示,这样可以分别得到年月日,时分秒信息.在讲述这3种c时间表示法之前,我们先看看linux 中有关时间的程序
------------------------------------------------------------
1. linux 中有一个time 程序, 用man time, 有对其介绍, 可以测量一个进程的执行占用了多少时间.
------------------------------------------------------------
例如: time ls 则会对ls 命令统计其时间资源,
 

$ time ls
1.c    1.php  50dB.txt   e_learn2.org      install.sh               Music         package.json    
....

real    0m0.005s
user    0m0.000s
sys    0m0.005s

时间精度为毫秒级,以几分几秒的方式来表示,3行分别是:
实际占用了多少时间
用户空间占用了多少时间
系统空间占用了多少时间.

------------------------------------------------------------
2. linux 中有一个date 命令, 用man date, 有对其介绍, 可以查看当前用字符串表示的时间,还有其它变换功能.
------------------------------------------------------------
 

$ date
2022年 12月 31日 星期六 16:39:57 CST

给出了字符串年月日星期几,时分秒,时区
下面看看c 语言中相关的time 函数
------------------------------------------------------------
3. linnux c 接口函数time 介绍
------------------------------------------------------------
man 2 time 给出了系统调用time 的使用说明.
最简单的 time() 返回一个time_t 类型的数值,代表从格林威治0时间开始到现在的秒数.
我们是东8区,就是1970年1月1日早上8点0分0秒为起始时间.
不能干说不练,我们来段c代码试试.

$ cat main.cpp
#include 
#include 

int main()
{
    time_t t = time(NULL);
    printf("time is:%ld\n",t);
    return 0;
}


运行结果
 ./test_time
 time is:1672477125

这个时间1'672'477'125 划分了一下为1.6G多是什么意思呢? 当然是格林威治时间到现在的秒数.

我们用date 命令转化一下为字符串就清楚了
 

$ date -d @1672477125
2022年 12月 31日 星期六 16:58:45 CST

而当前时间是:
 

$ date
2022年 12月 31日 星期六 17:09:09 CST

想看看0秒代表的是什么时间?
 

$ date -d @0
1970年 01月 01日 星期四 08:00:00 CST


------------------------------------------------------------
3. linnux c 接口函数localtime 介绍
------------------------------------------------------------
怎样用c 代码将秒值转化成年月日时分秒格式来显示? 这需要做一下除法运算了.
不过c库当然为我们准备好了调用接口,我们不用自己写了,这个函数叫localtime
man 2 localtime,有对localtime函数的说明, 引入了struct tm 结构,是分割的时间结构.
struct tm {
       int tm_sec;    /* Seconds (0-60) */
       int tm_min;    /* Minutes (0-59) */
       int tm_hour;   /* Hours (0-23) */
       int tm_mday;   /* Day of the month (1-31) */
       int tm_mon;    /* Month (0-11) */
       int tm_year;   /* Year - 1900 */
       int tm_wday;   /* Day of the week (0-6, Sunday = 0) */
       int tm_yday;   /* Day in the year (0-365, 1 Jan = 0) */
       int tm_isdst;  /* Daylight saving time */
   };
struct tm *localtime(const time_t *timep);
来段小程序测试一下: 注意加上年偏移,月偏移

#include 
#include 
#include 

int main()
{
    time_t t = time(NULL);
    printf("time is:%ld\n",t);
    struct tm* tm=localtime(&t);
    //注意:要加上年偏移1900, 月偏移1
    //表示年从1900开始,月从1开始, 至于为什么会这样,就是乌龟的屁股,规定了,就是这样了.
    printf("%d-%d-%d %d:%d:%d\n",\
            tm->tm_year+1900, \
            tm->tm_mon+1, \
            tm->tm_mday, \
            tm->tm_hour, \
            tm->tm_min, \
            tm->tm_sec);
    return 0;
}


运行结果:
./test_time
time is:1672539676
2023-1-1 10:21:16

------------------------------------------------------------
4. linnux c 接口函数gettimeofday 介绍
------------------------------------------------------------
时间精度怎样才能到毫秒,微妙级别呢? 这需要调用gettimeofday 函数,
你可以man gettimeofday 查看其说明
下面给出测试代码

$ cat main.cpp
#include
#include
int main()
{
    struct  timeval    tv;
    struct  timezone   tz;
    //timezone 应该设置成NULL, 否则也取不到正确的时区,只是0,0, 而拿不到东8区信息
    //该参数已经被废弃!
    gettimeofday(&tv,&tz);
    printf("tv_sec:%ld\n",tv.tv_sec);
    printf("tv_usec:%ld\n",tv.tv_usec);
    printf("tz_minuteswest:%d\n",tz.tz_minuteswest); // 时区
    printf("tz_dsttime:%d\n",tz.tz_dsttime); //夏令时
    return 0;
}


运行结果
$ ./test_time
tv_sec:1672572079
tv_usec:471694
tz_minuteswest:0
tz_dsttime:0

这3个函数是基础,知道了c接口函数,至于其它语言的接口函数,包括qt程序等,都只是锦上添花的事情了.

你可能感兴趣的:(#,linux,基础知识,linux,time)