標籤:
引言 :今天寫code 遇到一個 時間轉換的 突然對轉換函式不太確定 翻開之前的記錄 看了一下 然後順便發到這裡來
一:資料結構
linux下儲存時間常見的有兩種儲存方式,一個絕對秒數,一個是用一個結構來分別儲存年月日時分秒的
標頭檔 #include <time.h>
typedef long time_t; // 其實time_t 就是long 類型 長整型 time函數可以擷取從1970年到現在經過了多少
struct tm {
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 int tm_gmtoff; /*指定了日期變更線東面時區中UTC東部時區正秒數或UTC西部時區的負秒數*/const char *tm_zone; /*當前時區的名字(與環境變數TZ有關)*/};
二:函數(歸類記憶)返回秒數 區別在於mktime 可以返回順便 tm結構的1:time() 函數返回自 Unix 紀元(January 1 1970 00:00:00 GMT)起的目前時間的秒數 2:time_t mktime(struct tm * timeptr); 將時間轉換為自1970年1月1日以來期間的秒數返回字串 區別在於傳入參數不一樣 3:char *asctime(const struct tm* timeptr); 將結構中的資訊轉換為真實世界的時間,以字串的形式顯示 4:char *ctime(const time_t *timep); 將timep轉換為真是世界的時間,以字串顯示返回tm結構 區別在於 localtime 返回當前時區 5:struct tm* gmtime(const time_t *timep); 將time_t表示的時間轉換為沒有經過時區轉換的UTC時間(0時區) 6:struct tm* localtime(const time_t *timep); 和gmtime類似,但是它是經過時區轉換的時間 返回當前時區
PS: UTC (世界協調時間) 相當於本初子午線(即經度0度)上的平均太陽時稱0時區
GMT (格林威治) 跟UTC一樣 北京在東八區,北京時間領先於utc八個小時
DST (夏日節約時間)我見的比較少 度娘了一下 是指在夏天太陽升起的比較早時,將時鐘撥快一小時,以提早日光的使 用,
在英國則稱為夏 令 時間(Summer Time),也可能就是為什麼美國波士頓夏天時候跟中國相差12小時 冬天相差13
CST(中部標準時間) 重點說一下這個 一般來說 我們在linux 下 用date 命令 顯示的都是 cst 格式的
其實 cst 不單單代表中國時間 其實 代表了 美國 澳大利亞 古巴 中國 4個市區時間
CST Central Standard Time (USA) UT-6:00
CST Central Standard Time (Australia) UT+9:30
CST China Standard Time UT+8:00
CST Cuba Standard Time UT-4:00
linux下是通過/etc/localtime這個硬串連指向的/usr/share/zoneinfo下的時區檔案表示當前的真正時區
例如/etc/localtime指向了/usr/share/zoneinfo/Asia/Shanghai這個檔案的時候,CST就代表了中國標準時間。
cp 命令copy也是可以 例如
[[email protected] ~]# cp /usr/share/zoneinf/Asia/Shanghai /etc/localtime //複製相應的時區檔案
[[email protected] ~]# hwclock //寫入BIOS,避免重啟失效
三:舉例
1:顯示目前時間 常見的格式 Fri Jan 11 17:25:24 2014
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { time_t timep; time(&timep); /*擷取time_t類型的目前時間*/ printf("%s", asctime(gmtime(&timep)));/*用gmtime將time_t類型的時間轉換為struct tm類型的時間按,*/ printf("%s", ctime(&timep));//這個比較對 因為轉了時區跟date 比較一致 return 0; }
2: 絕對秒數轉相應格式 time_t 秒數結構---->localtime tm結構 ------>asctime 轉成字串
time_t 秒數結構---->localtime tm結構 ------>strftime 轉格式
#include <stdio.h>#include <stdlib.h>#include <time.h>int main(){ time_t timep; struct tm *test = NULL; char tm[100]; timep = 1378742400; printf("%s\n",asctime(localtime(&time));//轉 字串格式 struct tm *tmtest = NULL; test = localtime(&timep); if(strftime(tm, sizeof(tm), "%Y-%m-&d %H:%M:%S",test)) return -1; printf("%s\n", tm); return 0;}
3:字串轉絕對秒數 最後都是用到mktime轉為絕對秒數 代碼不舉例了
linux 時間轉換