time_t tm timeval 和 時間字串的轉換
阿新 • • 發佈:2019-01-07
轉自:http://blog.csdn.net/ncepubdtb/article/details/38899505,做了一點補充。
- 1、常用的時間儲存方式
- 1)time_t型別,這本質上是一個長整數,表示從1970-01-01 00:00:00到目前計時時間的秒數,如果需要更精確一點的,可以使用timeval精確到毫秒。
- 2)tm結構,這本質上是一個結構體,裡面包含了各時間欄位
- structtm {
- 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 */
- };
- 其中tm_year表示從1900年到目前計時時間間隔多少年,如果是手動設定值的話,tm_isdst通常取值-1。
- 3)struct timeval結構體在time.h中的定義為
-
[cpp] view
plain copy
print?
- struct timeval {
- time_t tv_sec; /* seconds */
-
suseconds_t tv_usec; /* microseconds */
- };
- 2、常用的時間函式
- time_t time(time_t *t); //取得從1970年1月1日至今的秒數
- char *asctime(conststructtm *tm); //將結構中的資訊轉換為真實世界的時間,以字串的形式顯示
- char *ctime(consttime_t *timep); //將timep轉換為真是世界的時間,以字串顯示,它和asctime不同就在於傳入的引數形式不一樣
- structtm *gmtime(consttime_t *timep); //將time_t表示的時間轉換為沒有經過時區轉換的UTC時間,是一個struct tm結構指標
- structtm *localtime(consttime_t *timep); //和gmtime類似,但是它是經過時區轉換的時間。
- time_t mktime(structtm *tm); //將struct tm 結構的時間轉換為從1970年至今的秒數
- int gettimeofday(struct timeval *tv, struct timezone *tz); //返回當前距離1970年的秒數和微妙數,後面的tz是時區,一般不用
- double difftime(time_t time1, time_t time2); //返回兩個時間相差的秒數
- 3、時間與字串的轉換
- 需要包含的標頭檔案如下
- #include <iostream>
- #include <time.h>
- #include <stdlib.h>
- #include <string.h>
- 1)unix/windows下時間轉字串參考程式碼
- time_t t; //秒時間
- tm* local; //本地時間
- tm* gmt; //格林威治時間
- char buf[128]= {0};
- t = time(NULL); //或者time(&t);//獲取目前秒時間
- local = localtime(&t); //轉為本地時間
- strftime(buf, 64, "%Y-%m-%d %H:%M:%S", local);
- std::cout << buf << std::endl;
- gmt = gmtime(&t);//轉為格林威治時間
- strftime(buf, 64, "%Y-%m-%d %H:%M:%S", gmt);
- std::cout << buf << std::endl;
- 2)unix字串轉時間參考程式碼
- tm tm_;
- time_t t_;
- char buf[128]= {0};
- strcpy(buf, "2012-01-01 14:00:00");
- strptime(buf, "%Y-%m-%d %H:%M:%S", &tm_); //將字串轉換為tm時間
- tm_.tm_isdst = -1;
- t_ = mktime(&tm_); //將tm時間轉換為秒時間
- t_ += 3600; //秒數加3600
- tm_ = *localtime(&t_);//輸出時間
- strftime(buf, 64, "%Y-%m-%d %H:%M:%S", &tm_);
- std::cout << buf << std::endl;
- 3)由於windows下沒有strptime函式,所以可以使用scanf來格式化
- time_t StringToDatetime(char *str)
- {
- tm tm_;
- int year, month, day, hour, minute,second;
- sscanf(str,"%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minute, &second);
- tm_.tm_year = year-1900;
- tm_.tm_mon = month-1;
- tm_.tm_mday = day;
- tm_.tm_hour = hour;
- tm_.tm_min = minute;
- tm_.tm_sec = second;
- tm_.tm_isdst = 0;
- time_t t_ = mktime(&tm_); //已經減了8個時區
- return t_; //秒時間
- }
- 4)timeval獲取時間示例:
-
[cpp] view
plain copy
print?
- struct timeval start_time, over_time, consume_time;
- gettimeofday(&over_time, NULL);//get the current time
- start_time = over_time;
- do something.....
- gettimeofday(&over_time, NULL);
- timeval_subtract(&consume_time, &start_time, &over_time);//計算時間差
-
[cpp] view
plain copy
print?
- /**
- * 計算兩個時間的間隔,得到時間差
- * @param struct timeval* resule 返回計算出來的時間
- * @param struct timeval* x 需要計算的前一個時間
- * @param struct timeval* y 需要計算的後一個時間
- * return -1 failure ,0 success
- **/
- timeval_subtract(struct timeval* result, struct timeval* x, struct timeval* y)
- {
- if ( x->tv_sec>y->tv_sec )
- return -1;
- if ( (x->tv_sec==y->tv_sec) && (x->tv_usec>y->tv_usec) )
- return -1;
- result->tv_sec = ( y->tv_sec-x->tv_sec );
- result->tv_usec = ( y->tv_usec-x->tv_usec );
- if (result->tv_usec<0)
- {
- result->tv_sec--;
- result->tv_usec+=1000000;
- }
- return 0;
- }
-
[cpp] view
plain copy
print?
- 4、關於localtime與localtime_r的區別
-
[cpp] view
plain copy
print?
- structtm *localtime(consttime_t *timep);
-
[cpp] view
plain copy
print?
- 這個函式在返回的時候,返回的是一個指標,實際的記憶體是localtime內部通過static申請的靜態記憶體,所以通過localtime呼叫後的返回值不及時使用的話,很有可能被其他執行緒localtime呼叫所覆蓋掉
- structtm *localtime_r(consttime_t *timep, structtm *result);
-
[cpp] view
plain copy
print?
- localtim