在 Unix 系統下
時間的表示是以所謂的 Epoch Time 表示
也就是算從 1970.01.01 00:00:00 UTC 到現在經過了多少秒數
(可參考 http://en.wikipedia.org/wiki/Unix_time)
但是這樣的表示對於人類是非常沒有可讀性
因此就有像以下這樣的網頁
http://www.epochconverter.com/
供使用者在兩種時間格式上面做轉換
實際上程式是怎麼寫的呢?
假設你透過 gettimeofday() 來取得系統時間
則數據會被存放在 timeval 的資料結構中
其結構組成如下
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
接下來看看一些其他時間相關函式
例如 strftime()
(http://www.cplusplus.com/reference/clibrary/ctime/strftime/)
可以發現它所傳入的時間參數
是 tm 的資料結構
這兩個資料結構如何建立起相關性呢?
答案就是透過 localtime() 和 gmtime()
這兩個函式的傳入參數為 time_t 的資料結構
回傳為 tm 的資料結構
也就是我可以將 timeval 裡面為 time_t 結構的成員
透過 localtime() 和 gmtime() 轉換成 tm 的資料結構
最後即可透過一些格式化的函式如 strftime() 轉成想要的輸出格式
假設是要輸出可以符合寫進資料庫的格式
就可以參考這一篇囉:
http://dev.mysql.com/doc/refman/5.0/en/datetime.html
以下為程式範例:
#include <stdio.h>
#include <time.h>
int main()
{
struct tm *timeinfo;
char buffer[80];
time_t t = 1313427070;
timeinfo = localtime(&t);
strftime (buffer, 80, "%Y%m%d%H%M%S", timeinfo);
printf("%s\n", buffer);
return 0;
}
輸出結果為:20110816005110
其中程式碼中 13 開頭那串數字可改成其他的
例如假設是要吃一個時間參數的話(如 timeval tv)
則為 time_t t = tv.tv_sec
