部分代碼說明:
一、Unix/Linux系統下的一種時間結構:
1、time_t 類型:長整型,一般用來表示從1970-01-01 00:00:00時以來的秒數,精確度:秒;
由函數time()獲取;該類型定義在頭文件 /usr/include/sys/time.h 中。
1、time_t 類型:長整型,一般用來表示從1970-01-01 00:00:00時以來的秒數,精確度:秒;
由函數time()獲取;該類型定義在頭文件 /usr/include/sys/time.h 中。
2、struct tm 結構:由函數gmtime()解析time_t得到
struct tm*gmtime(const time_t*timep);
函數說明:gmtime()將參數timep 所指的time_t 結構中的信息轉換成真實世界所使用的時間日期表示方法,然后
將結果由結構tm返回。
結構tm的定義為
struct tm
{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
int tm_sec 代表目前秒數,正常范圍為0-59,但允許至61秒
int tm_min 代表目前分數,范圍0-59
int tm_hour 從午夜算起的時數,范圍為0-23
int tm_mday 目前月份的日數,范圍01-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 日光節約時間的旗標
此函數返回的時間日期未經時區轉換,而是UTC時間。
struct tm*gmtime(const time_t*timep);
函數說明:gmtime()將參數timep 所指的time_t 結構中的信息轉換成真實世界所使用的時間日期表示方法,然后
將結果由結構tm返回。
結構tm的定義為
struct tm
{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
int tm_sec 代表目前秒數,正常范圍為0-59,但允許至61秒
int tm_min 代表目前分數,范圍0-59
int tm_hour 從午夜算起的時數,范圍為0-23
int tm_mday 目前月份的日數,范圍01-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 日光節約時間的旗標
此函數返回的時間日期未經時區轉換,而是UTC時間。
3、localtime是 把從1970-1-1零點零分到當前時間系統所偏移的秒數時間轉換為本地時間,而gmtime函數轉換后的時間沒有經過時區變換,是UTC時間 。
一個實例:
void StoreEvent(char *str)
{
long tt;
struct tm *vtm;
int i;
char Etime[100];
char filename[20];
char dirname[20];
char path[100];
getcwd(path, sizeof(path)); //獲取當前路徑
time( &tt ); //獲取當前時間
vtm = localtime( &tt ); //轉換為日歷時間
sprintf(Etime,"%d-%02d-%02d %02d:%02d:%02d ",vtm->tm_year+1900,vtm->tm_mon+1,vtm->tm_mday,vtm->tm_hour,vtm->tm_min,vtm->tm_sec);
sprintf(filename,"/%d%02d%02d.txt",vtm->tm_year+1900,vtm->tm_mon+1,vtm->tm_mday);
sprintf(dirname,"/%d%02d",vtm->tm_year+1900,vtm->tm_mon+1);
strcat(path,dirname);
if(access(path,0)==-1) //access函數是查看文件是不是存在
{
if (mkdir(path,0777)) //如果不存在就用mkdir函數來創建
{
printf("creat file bag failed!!!\n");
}
}
{
long tt;
struct tm *vtm;
int i;
char Etime[100];
char filename[20];
char dirname[20];
char path[100];
getcwd(path, sizeof(path)); //獲取當前路徑
time( &tt ); //獲取當前時間
vtm = localtime( &tt ); //轉換為日歷時間
sprintf(Etime,"%d-%02d-%02d %02d:%02d:%02d ",vtm->tm_year+1900,vtm->tm_mon+1,vtm->tm_mday,vtm->tm_hour,vtm->tm_min,vtm->tm_sec);
sprintf(filename,"/%d%02d%02d.txt",vtm->tm_year+1900,vtm->tm_mon+1,vtm->tm_mday);
sprintf(dirname,"/%d%02d",vtm->tm_year+1900,vtm->tm_mon+1);
strcat(path,dirname);
if(access(path,0)==-1) //access函數是查看文件是不是存在
{
if (mkdir(path,0777)) //如果不存在就用mkdir函數來創建
{
printf("creat file bag failed!!!\n");
}
}
strcat(path,filename);
FILE *fp;
fp = fopen(path,"ar+");
if(fp == NULL)
{
printf("文件異常。\n");
return;
}
lseek(fp,0,SEEK_END); //將讀寫位置移到文件尾
strcat(Etime,str);
fputs(Etime,fp);
fflush(fp);
fsync(fileno(fp)); //同步緩存
fclose(fp);
}
FILE *fp;
fp = fopen(path,"ar+");
if(fp == NULL)
{
printf("文件異常。\n");
return;
}
lseek(fp,0,SEEK_END); //將讀寫位置移到文件尾
strcat(Etime,str);
fputs(Etime,fp);
fflush(fp);
fsync(fileno(fp)); //同步緩存
fclose(fp);
}
程序運行后會在當前目錄以“年月”為名創建一個文件夾,並在該文件夾下以“年月日”為名創建一個txt文檔,文檔內容實例如下:
2019-02-18 11:10:21 開機。
2019-02-18 11:10:46 開啟風機。
2019-02-18 11:11:26 開啟風機。
2019-02-18 12:02:07 開機。
2019-02-18 14:43:17 開機。
2019-02-18 11:10:46 開啟風機。
2019-02-18 11:11:26 開啟風機。
2019-02-18 12:02:07 開機。
2019-02-18 14:43:17 開機。