我是靠谱客的博主 害羞硬币,最近开发中收集的这篇文章主要介绍初学C语言之时间操作一. 别名二. 相关的库函数三. 程序睡眠四. 计时器五. 扩展函数库,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 一. 别名
  • 二. 相关的库函数
    • 2.1 time 库函数
    • 2.2 localtime库函数
    • 2.3 mktime 库函数
    • 2.4 代码演示
  • 三. 程序睡眠
  • 四. 计时器
  • 五. 扩展函数库

在实际开发中, 对日期和时间的处理操作非常多, 本文操作系统的时区配置为中国北京或上海时间.
root用户中执行, 修改命令如下:

[root@bi hello]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@bi hello]# date  // 查看当前时间
[root@bi hello]# date -s 2021/05/13  // 修改当前日期
[root@bi hello]# date -s 14:28 // 修改当前时间

一. 别名

time_t 是长整型 在<time.h>头文件中有定义
typedef lont time_t;

二. 相关的库函数

2.1 time 库函数

用途是返回一个值, 也就是从1970-1-1 00:00:00秒到现在秒数
time 函数是C语言标准库中的函数,在<time.h>申明
有两种调用 方法, 代码中有演示

2.2 localtime库函数

功能: 把time_t表示的值转换为struct tm表示的时间.
返回值: 是个结构体, 解释如下
struct tm {
int tm_sec; //秒数, 取值[0-59]
int tm_min; //分钟数, 取值[0-59]
int tm_hour; //小时数, 取值[0-23]
int tm_mday; // 一个月中的天, 取值[1, 31]
int tm_mon; //月份(0代表1月, 以此类推),取值[0,11]
int tm_year; // 年份, 其值等于实际年份减少1900;
int tm_wday; //星期, 取值[0-6], 0代表星期天, 1代表期一, 类推
int tm_yday; // 从每年1月1日起,开始的天数, 取值区间[0, 365], 0代表1月1日, 1代表1月2日, 以此类推
int tm_isdst; //夏令时, 意义不大,我们一般不用.
}

2.3 mktime 库函数

功能: 与localtime 函数相反, 把stuct tm的函数转为time_t长整型的

2.4 代码演示

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>


int main(){
    time_t tnow1, tnow2;

    tnow1=time(0);  // 第一种方法
    printf("=%ld=n", tnow1);

    time(&tnow2);  // 第二种方法
    printf("=%ld=n", tnow2);

    // 演示 localtime
    struct tm *sttm;

    sttm=localtime(&tnow1);
    printf("%d-%d-%d %d:%d:%d  今天是周%d, 一年中的第%d天n", sttm->tm_year,sttm->tm_mon, sttm->tm_mday, sttm->tm_hour, sttm->tm_min,sttm->tm_sec,sttm->tm_wday, sttm->tm_yday);

    char date[11];
    char time[9];
    char datetime[21];
    sprintf(date, "%04u-%02u-%02u",  sttm->tm_year+1900,sttm->tm_mon+1, sttm->tm_mday);
    sprintf(time, "%02u:%02u:%02u",  sttm->tm_hour, sttm->tm_min,sttm->tm_sec);
    sprintf(datetime, "%s %s", date, time);
    printf("=%s=n", datetime);

    // 演示 mktime
    memset(sttm, 0, sizeof(sttm));
    sttm->tm_year=2021-1900;
    sttm->tm_mon=5-1;
    sttm->tm_mday=13;
    sttm->tm_hour=15;
    sttm->tm_min=42;
    sttm->tm_sec=0;
    sttm->tm_isdst=0;

    printf("%ldn",mktime(sttm));
}

三. 程序睡眠

sleep(1) 休眠1秒
usleep(1,000,000) 休眠1秒, 1秒=1000000微秒.

四. 计时器

  1. timeval 结构体
    struct timeval {
    long tv_sec; // 当前秒数
    long tv_usec; // 当前秒的微秒数
    }
  2. timezone 结构体, 时区,实际开发中不常用.
    struct timezone {
    int tz_minuteswest; // 和greenwich时间差了多少分钟;
    int tz_dattime; // 夏令时还是冬令时
    }
  3. gettimeofday 库函数
    获得当前的秒和微秒的时间,秒是指从19701-1-1 到现在的秒数, 微秒是指当前已经逝去的微秒数.可用于程序的计时.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>


int main(){
    struct timeval begin, end;

    gettimeofday(&begin, 0);
    printf("=begin time, secs=%d, usec=%d=n", begin.tv_sec, begin.tv_usec);
    sleep(1);

    gettimeofday(&end, 0);
    printf("=end time, secs=%d, usec=%d=n", end.tv_sec, end.tv_usec);

    printf("两次间隔是: %d %d", end.tv_sec-begin.tv_sec, end.tv_usec-beging.tv_usec);
}

可以发现程序的运行也是需要用时间的.

注意事项: time.h 是ISO C99标准日期头文件, sys/time.h是linux系统的日期头文件,也就是这三个结构体或库函数是windows平台上无法使用.

应用经验:
时间偏移: 时间字符串转为时间戳, 加上秒数, 比如10分钟,就是10*60, 再将时间戳转为时间字符串.

五. 扩展函数库

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>


// 把整数的时间, 转为字符串格式的时间, 'YYYY-MM-SS HH:mm:ss'
int timetostr(const time_t tt, char *strtime);

// 把时间格式的字符串,转为时间戳输出
int strtotime(const *strime, time_t tt);
int main(){
    char strlocaltime[21];

    memset(strlocaltime, 0, sizeof(strlocaltime));

    time_t tt;
    tt=time(0);

    timetostr(tt, strlocaltime);

    printf("%sn", strlocaltime);
}

// 把时间格式的字符串,转为时间戳输出
int strtotime(const *strtime, time_t tt){
    struct tm sttm;
    // 2021-05-13 17:40:30
    char strtmp[11];
    //拆分 字符串中的 年
    memset(strtmp,0, sizeof(strtmp));
    strncpy(strtmp, strtime, 4);
    sttm.tm_year=atoi(strtmp)-1900;

    //拆分 字符串中的 月
    memset(strtmp,0, sizeof(strtmp));
    strncpy(strtmp, strtime+5,2);
    sttm.tm_mon=atoi(strtmp)-1;

    //拆分 字符串中的 日
    memset(strtmp,0, sizeof(strtmp));
    strncpy(strtmp, strtime+8,2);
    sttm.tm_mday=atoi(strtmp);

    //拆分 字符串中的 时
    memset(strtmp,0, sizeof(strtmp));
    strncpy(strtmp, strtime+11,2);
    sttm.tm_hour=atoi(strtmp);

    //拆分 字符串中的 分
    memset(strtmp,0, sizeof(strtmp));
    strncpy(strtmp, strtime+14,2);
    sttm.tm_min=atoi(strtmp);

    //拆分 字符串中的 日
    memset(strtmp,0, sizeof(strtmp));
    strncpy(strtmp, strtime+17,2);
    sttm.tm_sec=atoi(strtmp);

    tt=mktime(&sttm);
    return tt;
}


// 把整数的时间, 转为字符串格式的时间, 'YYYY-MM-SS HH:mm:ss'
int timetostr(const time_t tt, char *strtime){
    struct tm *sttm;
    sttm=localtime(&tt);
    if (sttm ==0) return -1;

    char date[11];
    char time[9];
    sprintf(date, "%04u-%02u-%02u",  sttm->tm_year+1900,sttm->tm_mon+1, sttm->tm_mday);
    sprintf(time, "%02u:%02u:%02u",  sttm->tm_hour, sttm->tm_min,sttm->tm_sec);
    sprintf(strtime, "%s %s", date, time);
    return 0;
}



最后

以上就是害羞硬币为你收集整理的初学C语言之时间操作一. 别名二. 相关的库函数三. 程序睡眠四. 计时器五. 扩展函数库的全部内容,希望文章能够帮你解决初学C语言之时间操作一. 别名二. 相关的库函数三. 程序睡眠四. 计时器五. 扩展函数库所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部