weiqi7777

进击吧,linux(十) 时间编程

0
阅读(1438)

           利用linux提供的时间相关的函数,可以获取时间。

           时间类型是有两种:

1、  UTC,也就是世界标准时间。也称为格林威治标准时间。

2、  Calendar time ,日历时间,从一个时间点(197011000秒)到目前的时间所经历的秒数。

clip_image002

内核提供一个time函数,可以得到日历时间。然后通过gmtime函数或者localtime函数,得到tm的时间格式。tm中包括了我们所用的时间,年月日等等。然后再通过asctime函数,可以将tm的时间格式给转化成字符串,方便我们查看。

下面就是各个函数的学习。同样,还是使用学习模板来学习。

      1.1 获取日历时间

1.1.1 函数名

    time

1.1.2 函数原形

    time(time_t *t)

1.1.3 函数功能

    获取日历时间

1.1.4 所属头文件

    <time.h>

1.1.5 返回值

    成功:返回日历时间(1970110时到现在的时间,以秒为单位)

    失败:-1

1.1.6 参数说明

    t:  如果t不为空,保存返回值。也可以为空。

1.1.7 示例代码

clip_image003

clip_image004

程序的结果就是日历时间,以秒为单位的。这个时间就很不直观了。需要自己对这个数据转化。

1.2 获取格林威治时间

1.2.1 函数名

    gmtime

1.2.2 函数原形

    struct tm *gmtime(const time_t *timep)

1.2.3 函数功能

   将日历时间转化成UTC(世界标准时间)

1.2.4 所属头文件

    <time.h>

1.2.5 返回值

    成功:世界标准时间,以tm结构体存储

clip_image006

失败:NULL

1.2.6 参数说明

    timep 待转化的日历时间

1.2.7 示例代码

clip_image008

clip_image009

        这样,时间就有可读性了,不过这时间是世界标准时间,不是本地的时间。注意年是从1900年算起的,所以年需要加上1900才是现在的年。月是从0开始的,所以需要加1

1.3 获取本地时间

1.3.1 函数名

    localtime

1.3.2 函数原形

    struct tm *localtime(const time_t *timep)

1.3.3 函数功能

    将日历时间转化为本地时间

1.3.4 所属头文件

    <stdio.h>

1.3.5 返回值

    成功:本地时间,以tm结构体存储

clip_image010

    失败:NULL

1.3.6 参数说明

    timep 待转化的日历时间

1.3.7 示例代码

    clip_image012

clip_image014

           这样,就得到了本地的时间了。

1.4 以字符串方式显示时间

1.4.1 函数名

    asctime

1.4.2 函数原形

char *asctime(const struct tm *tm)

1.4.3 函数功能

    struct tm格式的时间转化成字符串

1.4.4 所属头文件

    <time.h>

1.4.5 返回值

    成功: 字符串的首地址

    失败: NULL

1.4.6 参数说明

tm 待转化的tm格式时间

1.4.7 示例代码

clip_image015

           运行结果,时间显示就更有可读性了。

clip_image016

1.5 获取高精度时间

1.5.1 函数名

    gettimeofday

1.5.2 函数原形

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

1.5.3 函数功能

    获取高精度时间,时间(秒和微秒)保存在tv中,

1.5.4 所属头文件

    <sys/time.h>

1.5.5 返回值

    成功:0

    失败:-1

1.5.6 参数说明

    tv: 带有秒和微秒的结构体指针,从1970110:0:0开始到现在经历的秒数和微秒数

clip_image018

    tz 通常为空

clip_image020

1.5.7 示例代码

统计一个程序执行的时间

      clip_image022

    程序结果

     clip_image023

           花了9222微秒的时间。

 

下面就写一个显示日历的程序来巩固上面学习的函数。程序的功能是,只要一执行,就显示本地时间这个月的日历。

#include<time.h>
void main()
{
    time_t t;
    struct tm *shijian;
    int i;
    int day=1;
    int month,year,week,mon_day;
    /*获取日历时间*/
    time(&t);
    /*将日历时间转化为本地时间*/
    shijian = localtime(&t);
    /*得到年*/
    year = shijian->tm_year + 1900;
    /*得到月*/
    month = shijian->tm_mon + 1;
    /*得到这个月的第一天是星期几*/
    week = shijian->tm_wday - shijian->tm_mday%7 + 1;
   
    /*************得到这个月应该有多少天***********/
    if(month == 1 || month == 3  || month == 5 || month == 7 ||
       month == 8 || month == 10 || month == 12 )
        mon_day = 31;
    else if(month == 4 || month == 6  || month == 9 || month == 11)
        mon_day = 30;
    else
    {
        if(year % 400 == 0 || (year%4==0) &&(year%100!=0))
            mon_day = 29;
        else   
            mon_day = 28;
    }
    /**********************************************/
   
    printf("      %-4d%d\n",month,year);
    printf("Su Mo Tu We Th Fr Sa\n");
    for(i=0; i<week; i++)
        printf("   ");
    while(day<=mon_day)
    {
        if(i%7 == 0)
            printf("\n");
        printf("%2d ",day);
        i++;
        day++;
    }
    printf("\n");
}

    程序执行的结果:

    clip_image024

    上面是我写的程序执行的效果,下面是linux自带的cal命令显示日历的执行效果。看出来,写的程序执行的结果是正确的。