第4章 Linux环境(时间和日期)

计算机时间简述

所有的UNIX系统都使用同一个时间和日期的起点:格林尼治时间(GMT)1970年1月1日午夜(0点)。这是“UNIX纪元的起点”,Linux也不例外。Linux系统中所有的时间都以从那时起经过的秒数来衡量。这和MS-DOS处理时间的方法类似,只是MS-DOS纪元始于1980年。其他系统使用其他的纪元起始时间。

时间通过一个预定义的类型time_t来处理。这是一个大到能够容纳以秒计算的日期和时间和整数类型。在Linux系统中,它是一个长整型,与处理时间值的函数一起定义在头文件time.h

绝不要想当然地以为,时间就是32位的。在使用32位time_t类型的UNIX和Linux系统中,时间将在2038年回绕。到那里,我们希望系统都开始使用大于32位的time_t类型。随着64位处理器进入主流处理器市场,这一趋势几乎是必然的

#include <time.h>
time_h time(time_t *tloc);

你可以通过调用time函数得到底层的时间值,它返回的是纪元开始至今的秒数。如果tloc不是一个空指针,time函数还会把返回值写入tloc指针指向的位置

实验 time函数

下面这个简单的程序envtime.c演示了time函数的用法:

#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
    int i;
    time_t the_time;
    for(i=0;i<=10;i++){
        the_time = time((time_t *)0);
        printf("The time is %ld
",the_time);
        sleep(2);
    }
	exit(0);
}

运行这个程序,它会在20秒内每两秒钟打印一次底层的时间值

[root@centos7-apue test4]# ./envtime 
The time is 1575034299
The time is 1575034301
The time is 1575034303
The time is 1575034305
The time is 1575034307
The time is 1575034309
The time is 1575034311
The time is 1575034313
The time is 1575034315
The time is 1575034317
The time is 1575034319

实验解析
这个程序用一个空指针参数调用time函数,返回以秒数计算的时间和日期。程序休眠两秒后再重复调用time函数,总共调用10次
以从1970年开始计算的秒数来表示时间和日期,对测算某些事情持续的时间是很有用的。你可以把它考虑为简单地把两次调用time得到的值相减。然而ISO/ANSI C标准委员会经过审议,并没有规定用time_t类型来测量任意时间之间的秒数,他们发明了一个函数difftime,该函数用来计算两个time_t值之间的秒数并以double类型返回它。

#include <time.h>
double difftime(time_t,time1,time_t time2);

difftime函数计算两个时间值之间的差,并将time1-time2的值作为浮点数返回。对Linux来说,time函数的返回值是一个易于处理的秒数,但考虑到最大限度的可移植性,你最好使用difftime
为了提供(对人类)更为意义的时间和日期,你需要把时间值转换为可读的时间和日期。有一些标准函数可以帮我们做到这一点
gmtime函数把底层时间值分解为一个结构,该结构包含一些常用的成员:

#include <time.h>
struct tm *tmtime(const time_t timeeval);

tm结构被定义为至少包含表4-2所示的 成员

原文地址:https://www.cnblogs.com/anyux/p/11959013.html