linux c/c++ 获取时间

来源:互联网 发布:南通水立方js漂亮吗 编辑:程序博客网 时间:2024/05/21 21:22

linux c/c++ 获取时间


首先,直接能获取的时间只能是unix时间戳,经过转化后才能变为人们日常所能理解的年月日小时分秒。 


名词解释:

unix时间戳:

是从197011日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。


闰秒:

闰秒是指为保持协调世界时接近于世界时时刻,由国际计量局统一规定在年底或年中(也可能在季末)对协调世界时增加或减少1秒的调整。由于地球自转的不均匀性和长期变慢性(主要由潮汐摩擦引起的),会使世界时(民用时)和原子时之间相差超过到±0.9秒时,就把世界时向前拨1秒(负闰秒,最后一分钟为59秒)或向后拨1秒(正闰秒,最后一分钟为61秒);闰秒一般加在公历年末或公历六月末。20123月,中科院国家授时中心宣布我国71日进行闰秒调整,届时将现75960


日光节约时间: 

日光节约时间是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近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;     /*从每年的11日开始的天数取值区间为[0,365],其中0代表11日,1代表12日,以此类推 */

int tm_isdst;      /*夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst0;不了解情况时,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(&timestamp);                          /**>获取unix时间戳<**/
142     time_tm = localtime(&timestamp);  /*>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(&timestamp) << 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




 

 


0 0
原创粉丝点击