ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

时间函数 c/c++

2021-11-15 13:03:10  阅读:415  来源: 互联网

标签:函数 clock 日历 c++ tm 时间 time local


c/c++的时间函数是使用

1、明确几个时间概念

  1. Coordinated Universal Time(UTC):世界标准时间,也就是格林威治标准时间,中国位于东八区,中国内地的时间为UTC+8

  1. Clander Time:日历时间,从一个时间点(1970年1月1日0时0分0秒)到现在时间点所经历的秒数,这个时间为本地时间
  2. Clock tick:时钟计时单元

2、相关头文件:   time.h

       tm结构:

#ifndef _TM_DEFINED 
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代表一月) - 取值区间为[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;    /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/ 
         }; 
#define _TM_DEFINED 
#endif 

3、时间函数:

  1. 计时函数  clock_t clock (void)

数据类型clock_t:

#ifndef _CLOCK_T_DEFINED 
typedef long clock_t; 
#define _CLOCK_T_DEFINED 
#endif

       这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick),在MSDN中称之为挂钟时间(wal-clock)。

在time.h文件中,还定义了一个常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,其定义如下: 

#define CLOCKS_PER_SEC ((clock_t)1000) 。可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。下面举个例子,你可以使用公式clock()/CLOCKS_PER_SEC来计算一个进程自身的运行时间。

  1. time_t time( time_t* timer)  获取日历时间

       如果你已经声明了参数timer,你可以从参数timer返回现在的日历时间,同时也可以通过返回值返回现在的日历时间,即从一个时间点(例如:1970年1月1日0时0分0秒)到现在此时的秒数。如果参数为空(NUL),函数将只通过返回值返回现在的日历时间

  1. tm结构获取时间:

       struct tm * gmtime ( const time_t * timer)  将日历时间转化为标准时间

struct tm * localtime(const time_t * timer)  将日历时间转化为本地时间

  1. 固定时间格式输出函数:返回的时间格式为: 星期几 月份 日期 时:分:秒 年\n\0 

char * asctime (const struct tm* timeptr)   

通过tm结构来生成具有固定格式的保存时间信息的字符串

char* ctime ( const struct tm* timeptr)

通过日历时间来生成字符串

  1. 自定义时间格式

size_t strftime( 
    char *strDest, 
    size_t maxsize,

           const char *format, 
        const struct tm *timeptr  
    );

我们可以根据format指向字符串中格式命令把timeptr中保存的时间信息放在strDest指向的字符串中,最多向strDest中存放maxsize个字符。该函数返回向strDest指向的字符串中放置的字符数。 

         函数strftime()的操作有些类似于sprintf():识别以百分号(%)开始的格式命令集合,格式化输出结果放在一个字符串中。格式化命令说明串strDest中各种日期和时间信息的确切表示方法。格式串中的其他字符原样放进串中。格式命令列在下面,它们是区分大小写的。

%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 时区名称,如果不能得到时区名称则返回空字符。 
%% 百分号 

  1. double difftime(time_t time1, time_t time0)   计算两个时间点之间的时间差   
  2. time_t mktime(struct tm * timeptr) tm    结构时间转化成日历时间

代码:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int  main()
{
	clock_t start, end;				//计算程序执行时间
	time_t caltime;					//日历时间
	char str[100];					//自定义时间格式字符串
	struct tm* local;				//保存本地时间的结构
	start = clock();
	caltime = time(NULL);
	//计算日历时间
	printf("\n当前时刻的日历时间为:%lld", caltime);
	//固定时间格式输出
	local = gmtime(&caltime);
	printf("\n\n当前时刻的世界标准时间为:%d.%d.%d %d:%d:%d", local->tm_year+1900,local->tm_mon+1,local->tm_mday,\
		local->tm_hour,local->tm_min,local->tm_sec);
	local = localtime(&caltime);
	printf("\n\n当前时刻的本地标准时间为:%d.%d.%d %d:%d:%d", local->tm_year + 1900, local->tm_mon + 1, local->tm_mday, \
		local->tm_hour, local->tm_min, local->tm_sec);
	//自定义时间格式输出,只输出小时分钟
	strftime(str, 100, "\n\n\nThe time is %R\n", local);
	puts(str);
	//将本地时间转化为日历时间
	caltime = mktime(local);
	printf("\n转化后的日历时间为:%lld\n", caltime); // 可以判断两个caltime是否相等
	end = clock();
	printf("\n\n上述操作花费%f seconds\n", difftime(end, start)/CLOCKS_PER_SEC);
	return 0;
}

结果:

 

标签:函数,clock,日历,c++,tm,时间,time,local
来源: https://blog.csdn.net/qq_34109561/article/details/121332290

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有