新学C++的时间处理

一直使用COleDatetime,比较方便。不过最近代码重构,发现使用C++的时间处理比较合适,很多年没有用了,忘光了,于是重新看了下。

--------------------------------------------------------
计算程序运行时间,单位好像是毫秒
long     i = 10000000L; 
    clock_t start, finish; 
    double   duration; 
    /* 测量一个事件持续的时间*/ 
    start = clock(); 
    while( i-- )

    finish = clock(); 
    duration = (double)(finish - start) / CLOCKS_PER_SEC; 

---------------------------------------------------
 通过tm结构来获得日期和时间,tm结构在time.h中的定义如下: 

#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 

#ifndef _TM_DEFINED
struct tm {
        int tm_sec;     /* seconds after the minute - [0,59] */
        int tm_min;     /* minutes after the hour - [0,59] */
        int tm_hour;    /* hours since midnight - [0,23] */
        int tm_mday;    /* day of the month - [1,31] */
        int tm_mon;     /* months since January - [0,11] */
        int tm_year;    /* years since 1900 */
        int tm_wday;    /* days since Sunday - [0,6] */
        int tm_yday;    /* days since January 1 - [0,365] */
        int tm_isdst;   /* daylight savings time flag */
        };
#define _TM_DEFINED
#endif
-------------------------------------
而日历时间(Calendar Time)是通过time_t数据类型来表示的,用time_t表示的时间(日历时间)是从一个时间点(例如:1970年1月1日0时0分0秒)到此时的秒数。在time.h中,可以看到time_t是一个长整型数: 

#ifndef _TIME_T_DEFINED 
typedef long time_t;          /* 时间值 */ 
#define _TIME_T_DEFINED       /* 避免重复定义 time_t */ 
#endif 

 在time.h头文件中,还可以看到一些函数,它们都是以time_t为参数类型或返回值类型的函数: 
double difftime(time_t time1, time_t time0); 
time_t mktime(struct tm * timeptr); 
time_t time(time_t * timer); 
char * asctime(const struct tm * timeptr); 
char * ctime(const time_t *timer); 
-------------
获取当前时间,并且格式化
time_t tt;
tt=time(NULL);

tm *dt1=localtime(&tt);
CString str1=ctime(&tt);
-----------------------------------------------------
自定义时间格式使用strftime()函数将时间格式化为想要的格式。它的原型如下: 

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

如果想显示现在是几点了,并以12小时制显示,就象下面这段程序: 

#include “time.h” 
#include “stdio.h” 
int main(void) 

     struct tm *ptr; 
     time_t lt; 
     char str[80]; 
     lt=time(NUL); 
     ptr=localtime(&lt); 
     strftime(str,100,"It is now %I %p",ptr); 
     printf(str); 
     return 0; 


其运行结果为: 
It is now 4PM

而下面的程序则显示当前的完整日期: 
#include <stdio.h>
#include <time.h> 
void main( void ) 

         struct tm *newtime; 
         char tmpbuf[128]; 
         time_t lt1; 
         time( &lt1 ); 
         newtime=localtime(&lt1); 
         strftime( tmpbuf, 128, "Today is %A, day %d of %B in the year %Y.\n", newtime); 
         printf(tmpbuf); 

----------------------------------
结构时间转换为日历时间
tm dt1,*dt2;
dt1.tm_year=2016-1900;  //从1900开始的
dt1.tm_mon=9;
dt1.tm_mday=18;
dt1.tm_hour=21;
dt1.tm_min=45;
dt1.tm_sec=1;
dt1.tm_isdst=0;

time_t tt1;
tt1=mktime(&dt1);

dt2=localtime(&tt1); //用于验证前面的转换
**tm不需要输入全部的字段,值需要上面的7个就可以,其他可以算出来




版权声明:本文为wjb801原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。