c/c++ 时间函数
1 time()
头文件:time.h
函数原型:time_t time(time_t * timer)
功能: 获取当前的系统时间,返回的结果是一个time_t类型,其实就是一个大整数(long),其值表示从CUT
(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数。然后调用localtime将time_t所表示的CUT时间转换为本地时间(我们是+8区,比CUT多8个小时)并转成
struct tm类型,该类型的各数据成员分别表示年月日时分秒。
举例:
//获取当前时间
time_t nowtime;
struct tm *timeinfo;
time( &nowtime );//或者nowtime=time(NULL);
timeinfo = localtime( &nowtime );
int year, month, day;
year = timeinfo->tm_year + 1900;
month = timeinfo->tm_mon + 1;
day = timeinfo->tm_mday;
printf("%d :%d :%d\n", year, month, day);
char timE [80];
strftime ( timE,80,"Data:\n%Y-%m-%d \nTime:\n%I:%M:%S\n",timeinfo);
printf ("%s\n", timE);
说明: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输出时要加1
int tm_year; //自1900到当前的年数
int tm_wday; //自星期日的天数0-6
int tm_yday; //自1月1日起的天数,0-365
int tm_isdst;//是否采用夏时制,采用为正数
} ;
strftime()函数将时间格式化为我们想要的格式,原型如下:
size_t strftime(
char *strDest,
size_t maxsize,
const char *format,
const struct tm *timeptr
);
格式命令列在下面,它们是区分大小写的
%a 星期几的简写 Eg:Tue
%A 星期几的全称 Eg: Tuesday
%b 月分的简写
%B 月份的全称
%c 标准的日期的时间串
%C 年份的后两位数字
%d 十进制表示的每月的第几天 (范围为 00 至 31)。
%D 月/天/年
%e 在两字符域中,十进制表示的每月的第几天
%F 年-月-日
%g 年份的后两位数字,使用基于周的年
%G 年分,使用基于周的年
%h 简写的月份名
%H 24小时制的小时(范围为 00 至 23)。
%I 12小时制的小时 (范围为 01 至 12)。
%j 十进制表示的每年的第几天 (范围为 001 至 366)。
%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 时区名称,如果不能得到时区名称则返回空字符。
%% 百分号
2 clock()
头文件:time.h
函数原型:clock_t clock(void); clock_t其实就是long,即长整形
功能:函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数。常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,vc6.0和c++builder6.0中该常量是1000,因此一个计时单元是1毫秒。
举例:
long i = 10000000L;
clock_t start, finish;
double duration; //测量一个事件持续的时间
printf( "Time to do %ld empty loops is ", i );
start = clock();
while( i-- ) ;
finish = clock();
duration = (double)(finish - start)/ CLOCKS_PER_SEC;
printf( "%f seconds\n", duration );
WINDOWS API
3 GetTickCount
库文件:kernl32.dll
头文件:C/C++头文件winbase.h ;windows程序设计中可以使用头文件windows.h
函数原型:DWORD GetTickCount(void);
功能:返回从操作系统启动到现在所经过的毫秒数,它的返回值是DWORD
举例:
DWORD dwStart = GetTickCount();
//这里运行你的程序代码
DWORD dwEnd = GetTickCount();
则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位
这个函数只精确到55ms,1个tick就是55ms。
4 timeGetTime
库文件:winmm.lib,引用该库文件#pragma comment(lib,"winmm.lib")
函数原型:DWORD timeGetTime(VOID);
功能:返回从操作系统启动到现在所经过的毫秒数,它的返回值是DWORD,精确度比GetTickCount高(>=5ms)
举例:
#pragma comment(lib,"winmm.lib")
j=10000000;
DWORD dwStart1 = timeGetTime();
while(j--);
DWORD dwEnd1 = timeGetTime();
cout<<(dwEnd1-dwStart1)<<endl;
5 GetLocalTime
头文件:windows.h
函数原型:VOID GetLocalTime(
LPSYSTEMTIME lpSystemTime //address of system times structure
);
lpSystemTime: 指向一个用户自定义包含日期和时间信息的类型为 SYSTEMTIME 的变量,该变量用来保存函数获取的时间信息
功能:获取当地的当前系统日期和时间
SYSTEMTIME结构体
typedef struct _SYSTEMTIME
{
WORD wYear;//年
WORD wMonth;//月
WORD wDayOfWeek;//星期,0为星期日,1为星期一,2为星期二……
WORD wDay;//日
WORD wHour;//时
WORD wMinute;//分
WORD wSecond;//秒
WORD wMilliseconds;//毫秒
}SYSTEMTIME,*PSYSTEMTIME;
举例:
SYSTEMTIME time;
GetLocalTime(&time);
printf("当前时间为:-:-:-\n",time.wHour,time.wMinute,time.wSecond);
6 QueryPerformanceCounter
头文件:windows.h
函数原型:BOOL QueryPerformanceCounter(LARGE_INTEGER *ipPerformanceCount);//参数指向计数器的值,如果安装的硬件不支持高精度计时器,该参数将返回0
函数返回值:硬件不支持高精度计时器,函数返回0,否则返回非0
功能:得到高精度计时器的值(如果存在这样的计时器),精度可以达到微秒级别
辅助函数QueryPerformanceFrequency
函数原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
函数返回值:硬件不支持高精度计时器,函数返回0,否则返回非0
功能:返回硬件支持的高精度计数器的频率(每秒嘀哒声的个数)
typeef union _ LARGE_INTEGER
{
struct
{
DWORD LowPart;
LONG HighPart;
};
LONGLONG QuadPart;
} LARGE_INTEGER;
举例:
j=100000;
LARGE_INTEGER litmp;
LONGLONG qt1,qt2;
double dft,dff,dfm;
QueryPerformanceFrequency(&litmp);//获得时钟频率
dff=(double)litmp.QuadPart;
QueryPerformanceCounter(&litmp);//获得初始值
qt1=litmp.QuadPart;
while(j--);
QueryPerformanceCounter(&litmp);//获得终止值
qt2=litmp.QuadPart;
dfm=(double)(qt2-qt1);
dft=dfm*1000000/dff;//获得对应的时间值,微秒为单位
cout<<dft<<endl;
【版权声明】转载请注明出处 http://www.cnblogs.com/TenosDoIt/archive/2013/04/15/3022021.html
========================
在 C++ 中,处理时间和日期的函数有很多,主要分布在标准库 <ctime>
和 <chrono>
中。下面详细介绍一些常用的时间函数和类。
<ctime>
库
<ctime>
是 C 标准库的头文件,提供了处理日期和时间的函数。常用的函数和类型包括:
-
time_t:时间类型,表示从 Epoch(1970 年 1 月 1 日 00:00:00 UTC)起经过的秒数。
cpp -
tm:结构体,表示日期和时间的结构。
cppstruct 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; // 夏令时 };
-
time():返回当前的日历时间。
cpptime_t now = time(0); // 获取当前时间
-
localtime():将
time_t
转换为表示本地时间的tm
结构。cppstruct tm *ltm = localtime(&now);
-
gmtime():将
time_t
转换为表示 UTC 时间的tm
结构。cppstruct tm *gmt = gmtime(&now);
-
strftime():格式化时间输出。
cppchar buffer[80]; strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", ltm); printf("Formatted time: %s\n", buffer);
<chrono>
库
<chrono>
是 C++11 引入的头文件,提供了更加现代和精确的时间处理功能。主要类和函数包括:
-
duration:表示一段时间,可以用不同的精度表示(如秒、毫秒、微秒等)。
cpp -
time_point:表示一个时间点,通常与特定时钟(如系统时钟)关联。
cppauto now = std::chrono::system_clock::now(); // 获取当前时间点
-
system_clock:表示系统时钟。
cppauto now = std::chrono::system_clock::now(); // 获取当前时间点 time_t now_c = std::chrono::system_clock::to_time_t(now); // 转换为 time_t 类型
-
steady_clock:表示单调时钟,适合用于测量时间间隔,因为它不会被系统时间的调整所影响。
cppauto start = std::chrono::steady_clock::now(); // ... 一些操作 ... auto end = std::chrono::steady_clock::now(); auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); std::cout << "Operation took " << duration.count() << " milliseconds." << std::endl;
示例代码
下面是一个结合使用 <ctime>
和 <chrono>
的示例:
这个示例展示了如何使用 <ctime>
获取和格式化当前时间,以及如何使用 <chrono>
进行精确的时间测量。
====================
参数:
https://www.cnblogs.com/TenosDoIt/archive/2013/04/15/3022021.html