时间日期的概念,主要有以下几个:
Coordinated Universal TimeUTC):协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean TimeGMT)。比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。美国是UTC-5
Calendar Time:日历时间,是用从一个标准时间点到此时的时间经过的秒数来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是相对时间,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。
epoch:时间点。时间点在标准C/C++中是一个整数,它用此时的时间和标准时间点相差的秒数(即日历时间)来表示。
clock tick:时钟计时单元(而不把它叫做时钟滴答次数),一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位。
我们可以使用ANSI标准库中的time.h头文件。这个头文件中定义的时间和日期所使用的方法,无论是在结构定义,还是命名,都具有明显的C语言风格。下面,我将说明在C/C++中怎样使用日期的时间功能。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

struct timeval
{
time_t tv_sec; //
susenconds_t tv_usec; //微秒 10 e-6
}
基准计算时间为<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1970年一月一日 UTC(世界标准时间) 0(Epoch)
time_t表示的时间(日历时间)是从一个时间点(例如:197011000)到此时的秒数。在time.h中,我们也可以看到time_t是一个长整型数:
#ifndef _TIME_T_DEFINED
typedef long time_t; /*
时间值 */
#define _TIME_T_DEFINED /*
避免重复定义 time_t */
#endif
大家可能会产生疑问:既然time_t实际上是长整型,到未来的某一天,从一个时间点(一般是197011000)到那时的秒数(即日历时间)超出了长×××所能表示的数的范围怎么办?对time_t数据类型的值来说,它所表示的时间不能晚于2038118191407。为了能够表示更久远的时间,一些编译器厂商引入了64位甚至更长的×××数来保存日历时间。比如微软在Visual C++中采用了__time64_t数据类型来保存日历时间,并通过_time64()函数来获得日历时间(而不是通过使用32位字的time()函数),这样就可以通过该数据类型保存300111000(不包括该时间点)之前的时间。

 

下面的代码演示了如何获取当前系统时间并转换成字符串:
timeval tv;
gettimeofday(&tv,NULL);
std::cout<<ctime(&tv.tv_sec)<<endl;//将秒数转换成当前时间的字符串表示
tm及其相关API
time(取得目前的时间)
表头文件 #include<time.h>
定义函数 time_t time(time_t *t);
函数说明 此函数会返回从公元197011日的UTC时间从000秒算起到现在所经过的秒数。如果t 并非空指针的话,此函数也会将返回值存到t指针所指的内存。
返回值 成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于errno中。

 

结构tm的定义为
struct tm
{
int tm_sec//代表目前秒数,正常范围为0-59,但允许至61
int tm_min//代表目前分数,范围0-59
int tm_hour// 从午夜算起的时数,范围为0-23
int tm_mday// 目前月份的日数,范围01-31
int tm_mon// 代表目前月份,从一月算起,范围从0-11
int tm_year// 1900 年算起至今的年数
int tm_wday// 一星期的日数,从星期一算起,范围为0-6
int tm_yday// 从今年11日算起至今的天数,范围为0-365
int tm_isdst// 日光节约时间的旗标
};
示例如下:
time_t sec = time( 0 );//获取当前秒数(UTC)时间
struct tm tmbuf;
localtime_r( &sec, &tmbuf);//将秒数转换成当地时区时间

 

 

将字符串转换成time_t

char time_str[128] = "2005-10-18 9:37:45";
struct tm tmp;
strptime(time_str, "%Y-%m-%d %H:%M:%S", &tmp);
time_t tm = mktime(&tmp);


time_t转换成字符串:

time_t tm = time(NULL);
struct tm tmp;
localtime_r(&tm, &tmp);
strftime(buffer, bufferlen, "%Y-%m-%d %H:%M:%S", &tmp);