关于系统时间的一些time库函数

这篇具有很好参考价值的文章主要介绍了关于系统时间的一些time库函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • (꒪ꇴ꒪ ),hello我是祐言
  • 博客主页:C语言基础,Linux基础,软件配置领域博主🌍
  • 快上🚘,一起学习!
  • 送给读者的一句鸡汤🤔:
  • 集中起来的意志可以击穿顽石!
  • 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏

        编程中经常用到时间表达及转换的函数,它们都定义在 time.h 库函数中,在此做一下总结,以方便后续查看使用。

一、几个时间概念:

1.Coordinated Universal Time(UTC)

        协调世界时,又称世界标准时间,也即格林威治标准时间(Greenwich Mean Time,GMT),中国内地的时间与UTC得时差为+8,也即UTC+8,美国为UTC-5。

2.Calendar Time

        日历时间,是用"从一个标准时间点到此时的时间经过的秒数"来表示的时间。标准时间点对不同编译器可能会不同,但对一个编译系统来说,标准时间是不变的。一般是表示距离UTC时间 1970-01-01 00:00:00的秒数。

3.epoch

        时间点。在标准c/c++中是一个整数,用此时的时间和标准时间点相差的秒数(即日历时间)来表示。

4.clock tick

        时钟计时单元(而不叫做时钟滴答次数),一个时钟计时单元的时间长短是由cpu控制的,一个clock tick不是cpu的一个时钟周期,而是c/c++的一个基本计时单位。

二、time.h 的定义

        time.h 头文件声明了四个变量类型两个宏和各种操作日期和时间的函数

其中4个变量:

size_t 是无符号整数类型,它是 sizeof 关键字的结果。
clock_t 这是一个适合存储处理器时间的类型,类型为unsigned long
time_t 这是一个适合存储日历时间类型。
struct tm 这是一个用来保存时间和日期的结构。

        ​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 到 11(注意)  \*/*
  int tm_year;     */\* 自 1900 年起的年数    \*/*
  int tm_wday;     */\* 一周中的第几天,范围从 0 到 6 \*/*
  int tm_yday;     */\* 一年中的第几天,范围从 0 到 365  \*/*
  int tm_isdst;    */\* 夏令时        \*/*
};

两个宏:

NULL 这个宏是一个空指针常量的值。
CLOCKS_PER_SEC 这个宏表示每秒的处理器时钟个数。用于将clock()函数的结果转化为以秒为单位的量,这个量的具体值是与操作系统相关的,通常为1000。

三、time库函数

1.clock函数

函数原型clock_t clock(void)

函数返回:返回clock函数执行起(一般为程序的开头),处理器时钟所使用的时间。

函数功能:用来计算程序或程序的某一段的执行时间。

实例:

#include<stdio.h>
#include<time.h>
​
int main()
{
  clock_t start_t,finish_t;
  double total_t = 0;
  int i = 0;
  start_t = clock();
  for(;i<100000;++i)
  {
    *//do someting;*
  }
  finish_t = clock();
  total_t = (double)(finish_t - start_t) / CLOCKS_PER_SEC;*//将时间转换为秒*
​
  printf("CPU 占用的总时间:%f**\n**", total_t);
  return 0;
}

2.time函数

函数原型: time_t time(time_t *timer)

参数说明: timer=NULL时得到当前日历时间(从1970-01-01 00:00:00到现在的秒数),timer=时间数值时,用于设置日历时间,time_t是一个unsigned long类型。如果 timer不为空,则返回值也存储在变量 timer中。

函数功能: 得到当前日历时间或者设置日历时间

函数返回: 当前日历时间

实例:

#include <stdio.h>
#include <time.h>
​
int main ()
{
 time_t seconds;
​
 seconds = time(NULL);
 printf("自 1970-01-01 起的小时数 = %ld**\n**", seconds/3600);
​
 return(0);
}

3.asctime函数

函数原型: char* asctime(struct tm * ptr)

函数功能:将结构struct tm * ptr所表示的时间以字符串表示

函数返回: 返回的时间字符串格式为:星期,月,日,小时:分:秒,年

参数说明: 结构指针ptr应通过函数localtime()或gmtime()得到

实例:

#include <stdio.h>
#include <time.h>
​
int main()
{
  struct tm t;*//更多情况下是通过localtime函数及gmtime函数获得tm结构*
​
  t.tm_sec   = 10;
  t.tm_min   = 10;
  t.tm_hour  = 6;
  t.tm_mday  = 25;
  t.tm_mon   = 2;
  t.tm_year  = 89;
  t.tm_wday  = 6;
​
  printf("%s**\n**",asctime(&t));
​
  return(0);
}

4.localtime函数

函数原型: struct tm *localtime(const time_t *timer)

函数功能: 使用 timer 的值来填充 tm 结构。timer 的值被分解为 tm 结构,并用本地时区表示。

函数返回: 以tm结构表达的时间

实例:

#include <stdio.h>
#include <time.h>
​
int main ()
{
  time_t timer;
  struct tm *Now;
​
  time( &timer );
  Now = localtime( &timer );
  printf("当前的本地时间和日期:%s", asctime(Now));
​
  return(0);
}

5.ctime函数

函数原型: char *ctime(const time_t * timer)

函数功能: 将日历时间参数timer转换为一个表示本地当前时间的字符串

函数返回: 返回字符串格式:星期,月,日,小时:分:秒,年

参数说明: timer参数应由函数time获得,其等价于 astime( localtime(timer) )

实例:

#include <stdio.h>
#include <time.h>
​
int main ()
{
  time_t curtime;
  time(&curtime);
  printf("当前时间 = %s", ctime(&curtime));
​
  return(0);
}

6.difftime函数

函数原型: double difftime(time_t time2, time_t time1)

函数功能: 得到两次机器时间差,单位为秒

函数返回: 时间差,单位为秒

参数说明: time1,time2分别表示两个不同的机器时间,该参数应使用time函数获得

实例:

#include <time.h>  
#include <stdio.h>  
int main() 
{ 
  time_t first,second; 
  time(&first); 
  sleep(2000); 
  time(&second);
  printf("The difference is: %f seconds",difftime(second,first)); 
​
  return 0; 
} 

7.gmtime函数

函数原型: struct tm *gmtime(time_t *timer)

函数功能: 得到以结构tm表示的时间信息,并用格林威治标准时间表示

函数返回: 以结构tm表示的时间信息指针

参数说明: timer用函数time()得到的时间信息

实例:

#include <stdio.h>
#include <time.h>
​
#define BST (+1)
#define CCT (+8)
​
int main ()
{
​
  time_t rawtime;
  struct tm *info;
​
  time(&rawtime);
  */\* 获取 GMT 时间 \*/*
  info = gmtime(&rawtime );
​
  printf("当前的世界时钟:**\n**");
  printf("伦敦:%2d:%02d**\n**", (info->tm_hour+BST)%24, info->tm_min);
  printf("中国:%2d:%02d**\n**", (info->tm_hour+CCT)%24, info->tm_min);
​
  return(0);
}

8.mktime函数

函数原型:time_t mktime(struct tm *timeptr)

函数功能:把 timeptr 所指向的结构转换为一个依据本地时区的 time_t 值

函数返回:该函数返回一个 time_t 值,该值对应于以参数传递的日历时间。如果发生错误,则返回 -1 值。

实例:

#include <stdio.h>
#include <time.h>
​
int main ()
{
  int ret;
  struct tm info;
  char buffer[80];
​
  info.tm_year = 2001 - 1900;
  info.tm_mon = 7 - 1;
  info.tm_mday = 4;
  info.tm_hour = 0;
  info.tm_min = 0;
  info.tm_sec = 1;
  info.tm_isdst = -1;
​
  ret = mktime(&info);
  if( ret == -1 )
  {
    printf("错误:不能使用 mktime 转换时间。**\n**");
  }
  else
  {
   strftime(buffer, sizeof(buffer), "%c", &info );
   print(buffer);
  }
​
  return(0);
}

9.strftime函数

函数原型: size_t strftime( char *strDest, size_t maxsize, const char *format, const struct tm *timeptr);

函数功能: 根据format指向字符串中格式命令把timeptr中保存的时间信息放在strDest指向的字符串中,最多向 strDest中存放maxsize个字符。

参数说明: 转化结果存在s中,最多maxsize个字符写到s中

函数返回: 该函数返回向strDest指向的字符串中放置的字符数(不包括'\0'),如果字符数多于maxsize,函数返回0。

实例:

/*format如下:它们是区分大小写的。
  %a 星期几的简写
  %A 星期几的全称
  %b 月分的简写
  %B 月份的全称
  %c 标准的日期的时间串
  %C 年份的后两位数字
  %d 十进制表示的每月的第几天
  %D 月/天/年
  %e 在两字符域中,十进制表示的每月的第几天
  %F 年-月-日
  %g 年份的后两位数字,使用基于周的年
  %G 年分,使用基于周的年
  %h 简写的月份名
  %H 24小时制的小时
  %I 12小时制的小时
  %j 十进制表示的每年的第几天
  %m 十进制表示的月份
  %M 十时制表示的分钟数
  %n 新行符
  %p 本地的AM或PM的等价显示
  %r 12小时的时间
  %R 显示小时和分钟:hh:mm
  %S 十进制的秒数
  %t 水平制表符
  %T 显示时分秒:hh:mm:ss
  %u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
  %U 第年的第几周,把星期日做为第一天(值从0到53)
  %V 每年的第几周,使用基于周的年
  %w 十进制表示的星期几(值从0到6,星期天为0)
  %W 每年的第几周,把星期一做为第一天(值从0到53)
  %x 标准的日期串
  %X 标准的时间串
  %y 不带世纪的十进制年份(值从0到99)
  %Y 带世纪部分的十进制年份
  %z,%Z 时区名称,如果不能得到时区名称则返回空字符。
  %% 百分号
*/
​
#include <stdio.h>
#include <time.h>
​
int main ()
{
  time_t rawtime;
  struct tm *info;
  char buffer[80];
​
  time( &rawtime );
​
  info = localtime( &rawtime );
​
  strftime(buffer,80,"%Y%m%e_%H%M%S", info);*//以年月日_时分秒的形式表示当前时间*
  printf("%s**\n**", buffer );
​
  return(0);
}

        最后再补充一个比较综合一点的例子:求给定时间和现在的系统时间的差。

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

void formatTime(int seconds, int *hours, int *minutes, int *seconds_remain) {
    seconds %= 3600;
	*hours = seconds / 3600;
    *minutes = seconds / 60;
    *seconds_remain = seconds % 60;
}

int main()
{
    int ret;
    struct tm info;
    char buffer[80];
//给定时间2023年7月25日10点54分01秒
    info.tm_year = 2023 - 1900;
    info.tm_mon = 7 - 1;
    info.tm_mday = 25;
    info.tm_hour = 10;
    info.tm_min = 54;
    info.tm_sec = 1;
    info.tm_isdst = -1;

    ret = mktime(&info);
    if (ret == -1)
    {
        printf("错误:不能使用 mktime 转换时间。**\n**");
    }
    else
    {
        strftime(buffer, sizeof(buffer), "%c", &info);
        printf("指定时间:%s\n", buffer);
    }

    time_t currentTime;
    time(&currentTime);
    char *timeStr = ctime(&currentTime); // 将time_t时间值转换为字符串格式
    printf("当前系统时间:%s\n", timeStr);

    // 计算时间差值
    double diff = difftime(currentTime, ret);

    int hours, minutes, seconds_remain;
    formatTime((int)diff, &hours, &minutes, &seconds_remain);
    printf("时间差值为:%d小时 %d分钟 %d秒\n", hours, minutes, seconds_remain);

    return 0;
}

        更多C语言Linux系统相关文章,关注专栏:

   手撕C语言

            玩转linux文章来源地址https://www.toymoban.com/news/detail-607358.html

📢写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 🎉感谢关注🎉

到了这里,关于关于系统时间的一些time库函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux 硬件时间(RTC time)、系统时间(UTC时间、Universal time)、本地时间(Local time)、时区(Time zone)与夏令时(DST)解析

    处理和管理时间是计算机科学的重要方面,但也是最复杂和容易混淆的方面之一。本文将详细介绍硬件时间、系统时间(UTC时间)、本地时间、时区和夏令时,希望能帮助读者更好地理解这些概念。 1.1 硬件时间简介 硬件时间,也被称为实时时钟(RTC),是指计算机主板上的

    2024年02月04日
    浏览(38)
  • 时序分析、时序约束和时序收敛(8)--关于时序路径、时钟悲观度和建立时间/保持时间的一些问题

    目录 写在前面 1、为什么同一条时序路径在报表里的值不一样?

    2024年02月08日
    浏览(47)
  • FPGA的时序分析、约束和收敛(8)----关于时序路径、时钟悲观度和建立时间/保持时间的一些问题

    目录 写在前面 1、为什么同一条时序路径在报表里的值不一样?

    2024年02月12日
    浏览(54)
  • Unity 关于生命周期函数的一些认识

    Unity 生命周期函数主要有以下一些: Awake() : 在脚本被加载时调用。用于初始化对象的状态和引用。 OnEnable() : 在脚本组件被启用时调用。在脚本组件被激活时执行一次,以及在脚本组件被重新激活时执行。 Reset() : 在脚本组件被重置时调用。用于重置脚本的初始状态。 Start

    2024年01月21日
    浏览(51)
  • C#(四十九)之关于string的一些函数

    1:startswith 字符串以。。。开头 2:endswith 字符串以。。。结尾 3:IndexOf 查找第一次在字符串中出现的位置(字符串,找到那)如果找不到,返回-1 4:IndexOfAny 同时搜索多个字符串,直到找到其中一个位置 5:截取字符串substring (从那开始,截取几位) 6:拆分字符串 split 变

    2024年02月12日
    浏览(39)
  • 【译】关于大语言模型的一些直觉

    原作:jasonwei, 引言:如今,一个悬而未决的问题是,为什么大型语言模型如此有效。在这篇博文中,我将讨论有关大型语言模型的六个基本直觉。其中许多直觉受到手动检查数据的启发,这是一项我发现有帮助且会推荐的练习。   语言模型经过预训练,可以简单地预测文本

    2024年03月26日
    浏览(38)
  • 排序之玩转qsort函数——【C语言】

    说起排序,我们会想起许多算法,在之前的博客中我也写到过,比如:冒泡排序法、快速排序法、选择排序法等等。其实在C语言中一直有一个可以将数组中的内容进行排序的函数且功能完善内容齐全的库函数——qsort函数。今天就让我们来探索一下吧! 目录 回调函数 初始

    2024年02月13日
    浏览(44)
  • 【C语言】带你玩转库函数qsort

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,之前更新的一直是比较基础和简单的内容,随着博主自己的水平的提升,今天给大家带来点不一样的东西,我们今天要讲的是库函数qsort的用法 废话不多说,咱们直接开始吧! 很多人可能是

    2024年02月16日
    浏览(37)
  • 玩转C语言:深入理解输入输出函数的奥秘

    ​ ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 在C语言中有一个函数putchar专门负责输出单个字符,其语法如下: 头文件:#includestdio.h 声明:int putchar(int char) char -- 这是要被写入的字符。该字符以其

    2024年02月21日
    浏览(58)
  • 玩转C语言:深入理解输入输出函数的奥秘!

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 在C语言中有一个函数putchar专门负责输出单个字符,其语法如下: 头文件:#includestdio.h 声明:int putchar(int char) char  – 这是要被写入的字符。该字符以其

    2024年02月22日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包