• C语言时间操作详解


    目录

    一、time_t别名

    二、time库函数

    举个例子

    运行效果

    三、tm结构体

    四、localtime库函数

    举个例子

     运行效果

    你还可以这样玩

    举个例子 

    运行效果 

    五、asctime库函数

    举个例子 

    运行效果

    六、mktime库函数

    举个例子

    运行效果

    七、程序睡眠

     七、获取十分钟后的时间

    运行效果


    一、time_t别名

    time_t 用来表示时间数据类型,它是一个long(长整数)类型的别名,在time.h文件中定义,表示一个日历时间,好像是从1970年1月1日0时0分0秒到现在的秒数,感兴趣的可以自己去了解一下

    typedef long time_t;

    二、time库函数

    • time 函数的用途是返回一个值,也就是从1970年1月1日0时0分0秒到现在的秒数
    • time 函数是C语言标准库中的函数,在time.h文件中声明
    time_t time(time_t *t);

    time函数有两种调用方法:

    1.   // 将空地址传递给time函数,并将time返回值赋给变量tnow 
    2. time_t tnow = time(0);

    或者

      time(&tnow);       // 将变量tnow的地址作为参数传递给time函数

    这两种方式,效果完全是一样的

    举个例子

    1. #include
    2. #include
    3. int main()
    4. {
    5. time_t tnow = time(0);
    6. time(&tnow);
    7. printf("%d\n",tnow);
    8. printf("%d\n",time(&tnow));
    9. return 0;
    10. }

    运行效果

    1970年1月1日到现在已经过去1666346212秒了

    三、tm结构体

    time_t 只是一个长整型,不符合我们的使用习惯,需要转换成可以方便表示时间的结构体,即 tm 结构体,tm结构体在 time.h 中声明

    如下:

    1. struct tm
    2. {
    3.   int tm_sec;     // 秒:取值区间为[0,59]
    4.   int tm_min;     // 分:取值区间为[0,59]
    5.   int tm_hour;    // 时:取值区间为[0,23]
    6.   int tm_mday;    // 日期:一个月中的日期:取值区间为[1,31]
    7.   int tm_mon;     // 月份:(从一月开始,0代表一月),取值区间为[0,11]
    8.   int tm_year;    // 年份:其值等于实际年份减去1900
    9.   int tm_wday;    // 星期:取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推
    10.   int tm_yday;    // 从每年的1月1日开始的天数:取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推
    11.   int tm_isdst;   // 夏令时标识符,该字段意义不大,我们不用夏令时。
    12. };

    这个结构定义了年、月、日、时、分、秒、星期、当年中的某一天。用这个结构体可以很方便的显示时间

    四、localtime库函数

    localtime 函数用于把 time_t 表示的时间转换为 struct tm 结构体表示的时间,函数返回struct tm结构体的地址

    函数声明:

     struct tm * localtime(const time_t *);

    举个例子

    1. #include
    2. #include
    3. int main()
    4. {
    5. time_t tnow = time(0);
    6. struct tm *info;
    7. info = localtime(&tnow);
    8. printf("当前的本地时间和日期:%s", asctime(info));
    9. return 0;
    10. }

     运行效果

    你还可以这样玩

    struct tm 结构体包含了时间的各要素,但还不是我们习惯的时间表达方式,我们可以用格式化输出printf、sprintf或fprintf等函数,把struct tm结构体转换为我们想要的结果

    举个例子 

    1. #include
    2. #include
    3. int main()
    4. {
    5. time_t tnow = time(0);// 获取当前时间
    6. printf("tnow=%lu\n",tnow); // 输出整数表示的时间
    7. struct tm *sttm;
    8. sttm = localtime(&tnow);// 把整数的时间转换为struct tm结构体的时间
    9. // yyyy-mm-dd hh24:mi:ss格式输出,此格式用得最多
    10. printf("%04u-%02u-%02u %02u:%02u:%02u\n",sttm->tm_year+1900,sttm->tm_mon+1,\
    11. sttm->tm_mday,sttm->tm_hour,sttm->tm_min,sttm->tm_sec);
    12. printf("%04u年%02u月%02u日%02u时%02u分%02u秒\n",sttm->tm_year+1900,\
    13. sttm->tm_mon+1,sttm->tm_mday,sttm->tm_hour,sttm->tm_min,sttm->tm_sec);
    14. // 只输出年月日
    15. printf("%04u-%02u-%02u\n",sttm->tm_year+1900,sttm->tm_mon+1,sttm->tm_mday);
    16. return 0;
    17. }

    运行效果 

    五、asctime库函数

    asctime 函数返回一个指向字符串的指针,它代表了结构 struct tm 的日期和时间

    函数声明:

    char *asctime(const struct tm *timeptr)

    参数

    timeptr 是指向 tm 结构的指针,包含了分解为如下各部分的日历时间:

    1. struct tm {
    2. int tm_sec; /* 秒,范围从 0 到 59                */
    3. int tm_min; /* 分,范围从 0 到 59                */
    4. int tm_hour; /* 小时,范围从 0 到 23                */
    5. int tm_mday; /* 一月中的第几天,范围从 1 到 31     */
    6. int tm_mon; /* 月份,范围从 0 到 11                */
    7. int tm_year; /* 自 1900 起的年数                */
    8. int tm_wday; /* 一周中的第几天,范围从 0 到 6         */
    9. int tm_yday; /* 一年中的第几天,范围从 0 到 365     */
    10. int tm_isdst; /* 夏令时                        */    
    11. };

    返回值

    该函数返回一个 C 字符串,包含了可读格式的日期和时间信息 Www Mmm dd hh:mm:ss yyyy,其中,Www 表示星期几,Mmm 是以字母表示的月份,dd 表示一月中的第几天,hh:mm:ss 表示时间,yyyy 表示年份

    举个例子 

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. struct tm t;
    7. t.tm_sec = 10;
    8. t.tm_min = 40;
    9. t.tm_hour = 20;
    10. t.tm_mday = 21;
    11. t.tm_mon = 10-1;// 注意,要减1
    12. t.tm_year = 2022-1900;// 注意,要减1900
    13. t.tm_wday = 5;
    14. printf("%s",asctime(&t));
    15. return(0);
    16. }

    运行效果

    六、mktime库函数

    • mktime 函数的功能与 localtime 函数相反
    • localtime函数用于把 time_t 表示的时间转换为 struct tm 表示的时间
    • mktime  函数用于把 struct tm 表示的时间转换为 time_t 表示的时间
    time_t mktime(struct tm *tm);

    函数返回time_t的值

    举个例子

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. // 2022-10-21 18:34:38整数表示是1666348478
    7. struct tm sttm;
    8. memset(&sttm,0,sizeof(sttm));
    9. sttm.tm_year=2022-1900; // 注意,要减1900
    10. sttm.tm_mon=10-1; // 注意,要减1
    11. sttm.tm_mday=21;
    12. sttm.tm_hour=18;
    13. sttm.tm_min=34;
    14. sttm.tm_sec=38;
    15. sttm.tm_isdst = 0;
    16. printf("2022-10-21 18:34:38 is %lu\n",mktime(&sttm));
    17. }

    运行效果

    七、程序睡眠

    想把程序挂起一段时间,可以使用 sleepusleep 两个库函数,需要包含unistd.h头文件中

    函数的声明如下:

    1. unsigned int sleep(unsigned int seconds);
    2. int usleep(useconds_t usec);

    sleep函数的参数是秒,usleep函数的参数是微秒,1秒=1000000微秒

    1.   sleep(1);           // 程序睡眠1秒。
    2.   sleep(10);          // 程序睡眠10秒。
    3.   usleep(100000);    // 程序睡眠十分之一秒。
    4.   usleep(1000000);   // 程序睡眠一秒。

     七、获取十分钟后的时间

    1. #include
    2. #include
    3. int main()
    4. {
    5. time_t tnow;
    6. tnow=time(0); // 获取当前时间
    7. printf("tnow=%lu\n",tnow); // 输出整数表示的时间
    8. struct tm *sttm;
    9. sttm=localtime(&tnow); // 把整数的时间转换为struct tm结构体的时间
    10. // yyyy-mm-dd hh24:mi:ss格式输出,此格式用得最多
    11. printf("%04u-%02u-%02u %02u:%02u:%02u\n",sttm->tm_year+1900,sttm->tm_mon+1,\
    12. sttm->tm_mday,sttm->tm_hour,sttm->tm_min,sttm->tm_sec);
    13. printf("十分钟后的时间\n");
    14. tnow = tnow+10*60;
    15. sttm=localtime(&tnow); // 把整数的时间转换为struct tm结构体的时间
    16. printf("%04u-%02u-%02u %02u:%02u:%02u\n",sttm->tm_year+1900,sttm->tm_mon+1,\
    17. sttm->tm_mday,sttm->tm_hour,sttm->tm_min,sttm->tm_sec);
    18. return 0;
    19. }

    运行效果

    如果想要10分钟前的时间就 tnow = tnow-10*60 ; 想要之前的时间或者之后的可以自己设置

  • 相关阅读:
    简单剖析Hashmap
    python笔记二【string】
    c# wpf template ItemTemplate 简单试验
    2022年全球一次能源消费量:石油消耗量持续增加达190.69百亿亿焦耳,亚太地区消费量居首位[图]
    JSON parse error: Cannot deserialize instance of `xxx` out of START_ARRAY token
    【HMS Core】定位地图服务常见问题,穿戴设备支持、比例尺支持、在非华为手机上逆地理编码的支持?
    关于Flutter doctor里两个警告的消除
    RCA关键清洗流程
    人力物力和时间资源有限?守住1个原则,精准覆盖所有兼容性测试!
    x-api接口鉴权架构设计和实现【万字+深度】
  • 原文地址:https://blog.csdn.net/XiaoQiu__/article/details/127450982