1. 程式人生 > >linux通過C/C++獲取本地時間的方法

linux通過C/C++獲取本地時間的方法

我們在程式設計中可能會經常用到時間,比如取得系統的時間(獲取系統的年、月、日、時、分、秒,星期等),或者是隔一段時間去做某事,那麼我們就用到一些時間函式。

linux下儲存時間常見的有兩種儲存方式,一個是從1970年到現在經過了多少秒,一個是用一個結構來分別儲存年月日時分秒的。
time_t 這種型別就是用來儲存從1970年到現在經過了多少秒,要想更精確一點,可以用結構struct timeval,它精確到微妙。
struct timeval
{
    long tv_sec; /*秒*/
    long tv_usec; /*微秒*/
};
而直接儲存年月日的是一個結構:
struct tm
{
    int tm_sec;  /*秒,正常範圍0-59, 但允許至61*/
    int tm_min;  /*分鐘,0-59*/
    int tm_hour; /*小時, 0-23*/
    int tm_mday; /*日,即一個月中的第幾天,1-31*/
    int tm_mon;  /*月, 從一月算起,0-11*/
    int tm_year;  /*年, 從1900至今已經多少年*/
    int tm_wday; /*星期,一週中的第幾天, 從星期日算起,0-6*/
    int tm_yday; /*從今年1月1日到目前的天數,範圍0-365*/
    int tm_isdst; /*日光節約時間的旗標*/
};
需要特別注意的是,年份是從1900年起至今多少年,而不是直接儲存如2008年,月份從0開始的,0表示一月,星期也是從0開始的, 0表示星期日,1表示星期一。
下面介紹一下我們常用的時間函式:
#include <time.h>
char *asctime(const struct tm* timeptr);
將結構中的資訊轉換為真實世界的時間,以字串的形式顯示
char *ctime(const time_t *timep);
將timep轉換為真是世界的時間,以字串顯示,它和asctime不同就在於傳入的引數形式不一樣
double difftime(time_t time1, time_t time2);
返回兩個時間相差的秒數
int gettimeofday(struct timeval *tv, struct timezone *tz);
返回當前距離1970年的秒數和微妙數,後面的tz是時區,一般不用
struct tm* gmtime(const time_t *timep);
將time_t表示的時間轉換為沒有經過時區轉換的UTC時間,是一個struct tm結構指標
stuct tm* localtime(const time_t *timep);
和gmtime類似,但是它是經過時區轉換的時間。
time_t mktime(struct tm* timeptr);
將struct tm 結構的時間轉換為從1970年至今的秒數
time_t time(time_t *t);

取得從1970年1月1日至今的秒數。

下面看一個簡單的例子:

[email protected]:/home/wl/桌面/實驗程式碼/2-2-2# cat -n time.cpp 
     1	#include <iostream>
     2	#include <time.h>
     3	using namespace std;
     4	int main()
     5	{
     6		time_t timel;
     7		time(&timel);  
     8	 	cout<<(asctime(gmtime(&timel)))<<endl; 
     9		return 0;
    10	}
[email protected]
:/home/wl/桌面/實驗程式碼/2-2-2# g++ time.cpp -o time [email protected]:/home/wl/桌面/實驗程式碼/2-2-2# ./time Sun Mar 16 09:26:59 2014 [email protected]:/home/wl/桌面/實驗程式碼/2-2-2# date 2014年 03月 16日 星期日 17:27:18 CST [email protected]:/home/wl/桌面/實驗程式碼/2-2-2#
time(&timel);返回了從1970年1月1日至今的秒數,
gmtime(&timel)把秒數轉化為struct tm格式,
asctime(gmtime(&timel))則把結構體格式化轉化為字串用以輸出顯示。

可以看到,沒有對時區進行處理,時間和本地時間差了幾個小時的。

例2:

[email protected]:/home/wl/桌面/c++# cat -n gettime.cpp 
     1	#include <iostream>
     2	#include <time.h>
     3	#include <string>
     4	using namespace std;
     5	int main()
     6	{
     7		 char* s;
     8		time_t time_ptr;
     9		time(&time_ptr);
    10		s= ctime(&time_ptr);
    11		cout<<s<<endl;
    12		return 0;
    13	}
[email protected]:/home/wl/桌面/c++# g++ -g gettime.cpp -o gettime
[email protected]:/home/wl/桌面/c++# ./gettime 
Sun Mar 16 20:30:30 2014