linux c/c++ 获取时间
首先,直接能获取的时间只能是unix时间戳,经过转化后才能变为人们日常所能理解的年月日小时分秒。
名词解释:
unix时间戳:
是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
闰秒:
闰秒是指为保持协调世界时接近于世界时时刻,由国际计量局统一规定在年底或年中(也可能在季末)对协调世界时增加或减少1秒的调整。由于地球自转的不均匀性和长期变慢性(主要由潮汐摩擦引起的),会使世界时(民用时)和原子时之间相差超过到±0.9秒时,就把世界时向前拨1秒(负闰秒,最后一分钟为59秒)或向后拨1秒(正闰秒,最后一分钟为61秒);闰秒一般加在公历年末或公历六月末。2012年3月,中科院国家授时中心宣布我国7月1日进行闰秒调整,届时将现7:59:60。
日光节约时间:
日光节约时间是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。日光节约时间本称为“夏时制”,即将时间向前拨快一小时,如现在是2:00,调整后为3:00。
需包含的头文件:
<sys/time.h>
相关结构体与定义:
struct timeval
{
long tv_sec; // 秒 unix时间戳
long tv_usec; // 微妙
};
typedef long time_t; /* 时间值time_t为长整型的别名*/
struct tm
{
int tm_sec; /*秒–取值区间为[0,59] */
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()为负。*/
long inttm_gmtoff; /*指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数*/
const char*tm_zone; /*当前时区的名字(与环境变量TZ有关)*/
};
struct timezone
{
int tz_minuteswest;/*和格林尼治时间差了多少分钟,若现在北京时间是16:00,那么格林尼治时间为8:00,时间差 = 格林尼治时间- 北京时间 = -480*/
int tz_dsttime;/*时间的修正方式,即日光节约时间*/
}
获取时间函数:
time_t time(time_t *t);
如果t是空指针,直接返回当前时间(unix时间戳)。如果t不是空指针,返回当前时间的同时,将返回值赋予t指向的内存空间。
int gettimeofday(struct timeval*tv, struct timezone *tz);
其参数tv是保存获取时间结果的结构体,参数tz用于保存时区结果;timezone 参数若不使用则传入NULL即可。
时间是转换函数:
struct tm *localtime(const time_t *clock); /*将time_t即unix时间戳转换为tm本地时间,,返回值指向一个静态分配的结构,该结构可能会被接下来的任何日期和时间函数调用覆盖*/
struct tm *gmtime(const time_t *time); /*将time_t即unix时间戳转换为tm格林威治(GMT)时间,返回值指向一个静态分配的结构,该结构可能会被接下来的任何日期和时间函数调用覆盖*/
struct tm*gmtime_r( const time_t* timer, struct tm* result ); /*该结构可能会被接下来的任何日期和时间函数调用覆盖,因此多线程应用里面,应该用gmtime_r函数替代gmtime函数,因为gmtime_r是线程安全的*/
struct tm*localtime_r( const time_t* timer, struct tm* result ); /*该结构可能会被接下来的任何日期和时间函数调用覆盖,因此多线程应用里面,应该用localtime_r函数替代localtime函数,因为localtime_r是线程安全的*/
char *ctime(const time_t *time); /*把日期和时间转换为字符串*/
char *asctime(const struct tm *tblock); /*把日期和时间转换为字符串*/
实例:
134 void time_test()
135 {
136 time_t timestamp; /*>time_t 是一个long int <*/
137 struct tm *time_tm; /*> tm结构体中由年月日等<*/
138 struct timeval time_val; /*>结构体中有2个字段:1秒unix时间戳,2微妙 <*/
139 struct timezone tz; /*>时区信息结构体<*/
140
141 time(×tamp); /**>获取unix时间戳<**/
142 time_tm = localtime(×tamp); /*>unix时间戳转化为月日年..<*/
143
144 gettimeofday(&time_val,&tz); /**>获取unix时间戳及微妙<**/
145
146 cout << "time is(week/m/d/h/m/s/y):" << asctime(time_tm) << endl; /*将tm结构体时间转成char* */
147 cout << "time is(week/m/d/h/m/s/y):" << ctime(×tamp) << endl; /*将tm结构体时间转成char* */
148 cout << "seconds is:" << time_val.tv_sec << "\nmicrosecond is:" << time_val.tv_usec << endl;
149 printf("tz_minutes west:%d\n",tz.tz_minuteswest); /*>本地时间与格林尼治时间差多少分钟<*/
150 printf("tz_dsttime:%d\n",tz.tz_dsttime); /*夏令时调整*/
151
152 int cnt = 1;
153 cnt += ( (time_tm->tm_hour*4) + (time_tm->tm_min)/15 ); /*此时刻是这一天的第几个时刻*/
154 cout << cnt << endl;
155 }
输出:
time is(week/m/d/h/m/s/y):Sun Aug 31 17:20:03 2014
time is(week/m/d/h/m/s/y):Sun Aug 31 17:20:03 2014
seconds is:1409476803
microsecond is:582475
tz_minutes west:-480
tz_dsttime:0
70