C++时间函数,c语言的时间函数怎么用

  C++时间函数,c语言的时间函数怎么用

  C/C对时间的操作也有很多值得注意的地方。最近技术组很多网友反复询问C语言中时间的操作、获取和显示。下面,在本文中,作者将主要介绍C/C中时间和日期的使用。

  通过学习很多C/C库,你可以有很多操作和使用时间的方法。但在此之前,你需要知道一些“时间”和“日期”的概念,主要有以下几点:

  协调世界时(UTC):协调世界时(Coordinated Universal Time),又称世界标准时间,也称为格林威治标准时间(GMT)。比如中国的时间和UTC的时间相差8,就是UTC 8。是UTC-5。

  日历时间:日历时间,是以“从一个标准时间点到这个时间的秒数”表示的时间。这个标准时间点对于不同的编译器是不同的,但是对于一个编译器系统,这个标准时间点是不变的。这个编译系统中的时间对应的日历时间是用这个标准时间点来衡量的,所以可以说日历时间是“相对时间”,但是无论你在哪个时区,同一时间对于同一个标准时间点,日历时间都是一样的。

  纪元:时间点。时间点在标准C/C中是一个整数,用当前时间和标准时间点之间的秒数(即日历时间)来表示。

  时钟滴答:时钟计数单位(而不是称之为时钟滴答数)。时钟计数单元的长度由CPU控制。时钟节拍不是CPU的一个时钟周期,而是C/C的一个基本计时单位。

  我们可以使用ANSI标准库中的time.h头文件。这个头文件中用来定义时间和日期的方法,无论是在结构定义还是命名上,都带有明显的C语言风格。接下来,我将解释如何在C/C中使用日期和时间函数。

  2.时机

  C/C中的计时函数是clock(),其相关的数据类型是clock _ t,在MSDN,Chad对时钟函数的定义如下:

  clock _ t clock(void);

  该函数返回从“启动该程序进程”到“调用程序中的clock()函数”的CPU时钟滴答数,在MSDN称为wal-clock。其中clock_t是用于节省时间的数据类型。在time.h文件中,我们可以找到它的定义:

  #ifndef _CLOCK_T_DEFINED

  typedef长时钟_ t;

  #定义_时钟_时间_定义

  #endif

  显然,clock_t是一个长整数。在time.h文件中,还定义了一个常数CLOCKS_PER_SEC,用来表示一秒钟内会有多少个时钟计数单位。其定义如下:

  #定义每秒时钟数((clock_t)1000)

  可以看到,每过千分之一秒(1毫秒),调用clock()函数返回的值就递增1。例如,您可以使用公式clock()/CLOCKS_PER_SEC来计算进程本身的运行时间:

  void elapsed_time()

  {

  printf(运行时间:%u秒。\n ,clock()/CLOCKS _ PER _ SEC);

  }

  当然,您也可以使用时钟功能来计算您的机器运行一个周期或处理其他事件所需的时间:

  #包含“stdio.h”

  #包含" stdlib.h "

  #包含“time.h”

  int main( void)

  {

  long i=10000000L

  clock_t开始,结束;

  双倍时长;

  /*测量事件的持续时间*/

  printf(做%ld个空循环的时间是,I);

  start=时钟();

  while(I-);

  finish=clock();

  duration=(double)(finish-start)/CLOCKS _ PER _ SEC;

  printf( %f秒\n ,持续时间);

  系统(“暂停”);

  }

  在作者的机器上,运行结果如下:

  做10000000次空循环的时间是0.03000秒

  从上面我们可以看出,时钟计时单元的长度是1ms,所以计时精度是1ms,那么是否可以改变CLOCKS_PER_SEC的定义,使其变大,从而使计时精度更高?通过尝试,你会发现这是不可能的。在标准C/C中,最小的时间单位是一毫秒。

  3.与日期和时间相关的数据结构

  在标准C/C中,我们可以通过tm结构获得日期和时间,它在time.h中的定义如下:

  #ifndef _TM_DEFINED

  结构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代表一月)-取值范围为[0,11] */

  int tm _ year/* year,其值等于实际年份减去1900 */

  int tm _ wday/* week取值范围为[0,6],其中0代表周日,1代表周一,以便推送*/int TM _ yday;/*从每年1月1日算起的天数取值范围为[0,365],其中0代表1月1日,1代表1月2日,依此类推*/

  int tm _ isdst/*夏令时标识符。实施夏令时时,tm_isdst为正。没有夏令时,tm_isdst为0;在不了解情况的情况下,Tm_isdst()为负。*/

  };

  #define _TM_DEFINED

  #endif

  ansi标准规定,使用tm结构时的时间表示为故障时间。

  日历时间由time_t数据类型表示,time_t表示的时间是从某个时间点(例如,1970年1月1日0: 00: 00)到此时间的秒数。在time.h中,我们还可以看到time_t是一个长整数:

  #ifndef _TIME_T_DEFINED

  typedef long time _ t;/*时间值*/

  #define _TIME_T_DEFINED /*避免重复定义time_t */

  #endif

  你可能会问:既然time_t其实是一个长整数,那么从一个时间点(一般是1970年1月1日0: 00: 00)到那个时间点的秒数(即日历时间)超出了长整数所能表示的数字范围怎么办?对于time_t数据类型的值,其代表的时间不能晚于2038年1月18日19: 14: 07。为了表示更长的时间,一些编译器制造商推出了64位甚至更长的整数来节省日历时间。比如微软在Visual C中采用__time64_t数据类型保存日历时间,通过_time64()函数(而不是使用32位time()函数)获取日历时间,这样3001年1月1日0: 00: 00(不含该时间点)之前的时间就可以通过该数据类型保存。

  在time.h的头文件中,我们还可以看到一些函数,都是以time_t为参数类型或者返回值类型:

  double difftime(time_t time1,time _ t time 0);

  time _ t mktime(struct TM * time ptr);

  time _ t time(time _ t * timer);

  char * ASC time(const struct TM * time ptr);

  char * ctime(const time _ t * timer);

  此外,time.h还提供了两个不同的函数,将日历时间(用time_t表示的整数)转换成我们通常看到的分别显示年、月、日、分、秒的时间格式tm:

  struct TM * GM time(const time _ t * timer);

  struct TM * local time(const time _ t * timer);

  参考MSDN,我们可以知道,微软C/C 7.0中的时间点的值(time_t对象的值)是从1899年12月31日0: 00: 00到这个时间点的秒数,而微软C/C的其他版本和所有不同版本的Visual C都是从1970年1月1日0: 00: 00到这个时间点计算的。

  4.与日期和时间相关的函数及其应用

  在本节中,我将向您展示如何使用time.h中声明的函数来操作time。这些操作包括获取当前时间、计算时间间隔、以不同形式显示时间等。

  4.1获取日历时间

  我们可以通过Time()函数得到日历时间,它的原型是:

  time _ t time(time _ t * timer);

  如果已经声明了参数timer,则可以从参数timer返回当前日历时间,也可以通过返回值返回当前日历时间,即从某个时间点(例如1970年1月1日0: 00: 00)到当前时间的秒数。如果参数为null (NUL),函数将只根据返回值返回当前日历时间。例如,以下示例用于显示当前日历时间:

  #包含“time.h”

  #include stdio.h

  int main(void)

  {

  struct tm * ptr

  time _ t lt

  lt=时间(NUL);

  printf(现在的日历时间是%d\n ,lt);

  返回0;

  }

  跑步的结果和当时的时间有关。我当时跑步的结果是:

  现在的日历时间是1122707619

  其中1122707619是我运行程序时的日历时间。即从1970年1月1日0: 00: 00到这个时间的秒数。

  4.2采购日期和时间

  这里所说的日期和时间就是我们通常所说的年、月、日、时、分、秒等信息。从第2节,我们已经知道所有这些信息都存储在一个名为tm的结构中,那么如何用tm结构将一个日历时间保存为一个对象呢?

  可以使用的函数有gmtime()和localtime()。这两个函数的原型是:

  struct TM * GM time(const time _ t * timer);

  struct TM * local time(const time _ t * timer);

  gmtime()函数将日历时间转换为通用标准时间(GMT ),并返回一个tm结构来保存该时间,而localtime()函数将日历时间转换为本地时间。例如,如果gmtime()函数得到的世界标准时间是2005年7月30日7: 18: 20,那么中国的localtime()函数得到的local time将比世界标准时间晚8小时,即2005年7月30日15: 18: 20。这里有一个例子:

  #包含“time.h”

  #include stdio.h

  int main(void)

  {

  struct tm * local

  time _ t t

  t=时间(NUL);

  本地=本地时间(

  printf(本地小时是:%d\n ,Local-TM _ hour);

  local=gmtime(

  printf(UTC小时为:%d\n ,local-TM _ hour);

  返回0;

  }

  运行结果是:

  当地时间是:15

  UTC时间是:7

  4.3固定时间格式

  我们可以通过asctime()函数和ctime()函数以固定格式显示时间,两者的返回值都是char*类型的字符串。返回的时间格式为:

  星期几:分钟:第二年\n\0

  示例:1980年1月2日星期三1980 \ n \ 0

  其中\n是换行符,\0是空字符,表示字符串的结尾。这是两个函数的原型:

  char * ASC time(const struct TM * time ptr);

  char * ctime(const time _ t * timer);

  asctime()函数用于通过tm结构生成一串固定格式的时间信息,而ctime()用于通过日历时间生成一个时间串。在这种情况下,asctime()函数只需要将tm结构对象中的字段填充到时间字符串的相应位置,而ctime()函数则需要先参考本地时间设置,将日历时间转换为本地时间,然后生成格式化字符串。下面,如果t是非空的time_t变量,那么:

  printf(ctime(t));

  相当于:

  struct tm * ptr

  ptr=localtime(

  printf(ASC time(ptr));

  然后,下面程序的两个printf语句的输出结果是不同的(除非您将本地时区设置为世界标准时间所在的时区):

  #包含“time.h”

  #include stdio.h

  int main(void)

  {

  struct tm * ptr

  time _ t lt

  lt=时间(NUL);

  ptr=gmtime(lt);

  printf(ASC time(ptr));

  printf(ctime(lt));

  返回0;

  }

  运行结果:

  2005年7月30日星期六08时43分03秒

  2005年7月30日星期六16时43分03秒

  4.4自定义时间格式

  我们可以使用strftime()函数来格式化我们想要的时间。其原型如下:

  size_t strftime(

  char *strDest,

  size_t maxsize,

  const char *格式,

  const struct tm *timeptr

  );

  我们可以根据format指向的字符串中的format命令,将timeptr中保存的时间信息放入strtest指向的字符串中,strtest中最多存储maxsize个字符。此函数返回指向strDest的字符串中的字符数。

  strftime()函数的操作有点类似于sprintf():它标识以百分号(%)开始的格式命令集,打印格式结果放在一个字符串中。该命令将字符串strDest中各种日期和时间信息的确切表示形式格式化。格式中的其他字符按原样放入字符串中。下面列出了这些格式,它们区分大小写。

  %一周中某一天的缩写

  %星期几的全名。

  %b月的缩写

  %B月的全名

  %c标准日期的时间字符串

  %C年的最后两位数字

  以%d的十进制表示形式表示的每个月的第几天

  %D月/日/年

  %e在双字符字段中,用十进制表示一个月中的第几天。

  %F年-月-日

  %g年的最后两位数,使用基于周的年份。

  %G年,使用基于周的年。

  %h的缩写月份名

  24小时制中的% h小时

  %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时区名称,如果无法获取时区名称,则为空字符。

  %%百分比符号

  如果你想显示时间,并以12小时制显示,就像下面的程序:

  #包含“time.h”

  #包含“stdio.h”

  int main(void)

  {

  struct tm * ptr

  time _ t lt

  字符串[80];

  lt=时间(NUL);

  ptr=local time(lt);

  strftime(str,100,现在是%I %p ,ptr);

  printf(str);

  返回0;

  }

  运行结果如下:

  现在是下午4点

  以下程序显示当前完整日期:

  #包含stdio.h

  #包含时间. h

  无效总管(无效)

  {

  struct tm * newtime

  char tmpbuf[128];

  time _ t lt1

  时间(lt1);

  new time=local time(lt1);

  strftime( tmpbuf,128,今天是%A,第%d天,在%Y年的%B中,\n ,new time);

  printf(tmpbuf);

  }

  运行结果:

  今天是星期六,2005年7月30日。

  4.5计算持续时间的长度

  有时候在实际应用中,需要计算一个事件的持续时间,比如打字速度。在第1节的时序部分,我已经给出了一个时钟函数的例子。Clock()函数可以精确到毫秒级。同时我们也可以使用difftime()函数,但是只能精确到秒。该函数定义如下:

  double difftime(time_t time1,time _ t time 0);

  虽然这个函数返回的以秒为单位的时间间隔是double类型,但并不意味着时间和double具有相同的精度,这是通过它的参数感受到的(time_t是以秒为单位计算的)。例如,下面的程序:

  #包含“time.h”

  #include stdio.h

  #include stdlib.h

  int main(void)

  {

  time_t开始,结束;

  开始=时间(NUL);

  系统(“暂停”);

  end=时间(NUL);

  printf(暂停用了%f秒。\n ,difftime(end,start));//-

  系统(“暂停”);

  返回0;

  }

  运行结果是:

  请按任意键继续。

  暂停用了2.000000秒。

  请按任意键继续。

  可想而知,停顿时间并不是那么巧合。整整2秒钟。实际上,您用下面的代码行替换了上面程序中带有“//-”注释的行:

  printf(暂停用了%f秒。\n ,结束-开始);

  运行结果是一样的。

  4.6分解时间转换为日历时间。

  这里的分解时间是指以年、月、日、时、分、秒等成分为单位的时间结构。在C/C中,是tm结构。我们可以用mktime()函数把tm结构表示的时间转换成日历时间。其功能原型如下:

  time _ t mktime(struct TM * time ptr);

  返回值是转换后的日历时间。这样,我们可以先设定一个分解时间,然后在这个时间上进行操作。以下示例可以计算1997年7月1日这一天:

  #包含“time.h”

  #include stdio.h

  #include stdlib.h

  int main(void)

  {

  struct TM t;

  一天中的时间;

  t . TM _ year=1997-1900;

  t . TM _ mon=6;

  t . TM _ mday=1;

  t . TM _ hour=0;

  t . TM _ min=0;

  t . TM _ sec=1;

  t . TM _ isdst=0;

  一天的时间=mktime(

  printf(ctime(t _ of _ day));

  返回0;

  }

  运行结果:

  1997年7月1日星期二00:00:01

  现在,使用mktime()函数,我们可以操作之前的任何时间吗?你能用这种方法算出1945年8月15日是哪一天吗?答案是否定的,因为这个时间是在1970年1月1日之前,所以在大多数编译器中,这类程序虽然可以编译,但是运行时会异常终止。

  摘自中国编程网

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: