経過時刻の出力例です。計算が数日にも及んでしまう際等に何日経過したかを書式付で出力することができます。計算例では、"20041125172211"のように、2004:年,11:月,25:日,17:時,22:分,11:秒を記したテキストから経過時刻を計算しています。
//----------------------------------------------------------------- // list_32.c: // 経過時刻の出力設定 //----------------------------------------------------------------- #include <stdio.h> #include <time.h> //----------------------------------------------------------------- void set_time(char* t_str); char* work_time(char* e_time,char* s_time); time_t get_time(char *tstr); //----------------------------------------------------------------- int main() { char stime[256],etime[256]; set_time(stime); // 開始時刻 sleep(5); set_time(etime); // 終了時刻 printf(" stime: %s\n",stime); printf(" etime: %s\n",etime); printf("経過時刻1: %s\n",work_time(etime,stime)); //-------------------------------------------------- // 文字列[YYYYMMDDHHMMSS]から経過時刻の計算 //-------------------------------------------------- sprintf(stime,"20041020173021"); sprintf(etime,"20041125173131"); printf("経過時刻2: %s\n",work_time(etime,stime)); return 0; } //----------------------------------------------------------------- // 時刻の設定 //----------------------------------------------------------------- void set_time(char* t_str) { time_t t = time(NULL); struct tm *tm = localtime(&t); strftime(t_str,sizeof(char)*256,"%Y%m%d%H%M%S",tm); } //----------------------------------------------------------------- // 経過時刻の計算 //----------------------------------------------------------------- char* work_time(char* e_time,char* s_time) { char* retbuf=(char*)calloc(256,sizeof(char)); int year,mon,day,hour,min,sec; time_t et = get_time(e_time); time_t st = get_time(s_time); time_t it = et - st; // 詳細時間計算 sec = it % 60; it /= 60; min = it % 60; it /= 60; hour = it % 24; day = it / 24; // 出力 if(day) sprintf(retbuf,"%d日%02d時間%02d分%02d秒",day,hour,min,sec); else sprintf(retbuf,"%02d時間%02d分%02d秒",hour,min,sec); return retbuf; } //----------------------------------------------------------------- // get_time(): // "YYYYMMDDHHMMSS" 型テキストから time_t への変換 //----------------------------------------------------------------- time_t get_time(char *tstr) { char buf[20]; time_t cal_time; struct tm work_tm; if(strlen(tstr) != 14) return(-1); strncpy(buf, tstr, 4); buf[4] = '\0'; work_tm.tm_year = atoi(buf) - 1900; strncpy(buf,tstr+4,2); buf[2] = '\0'; work_tm.tm_mon = atoi(buf) - 1; strncpy(buf, tstr+4+2, 2); work_tm.tm_mday = atoi(buf); strncpy(buf, tstr+4+2+2, 2); work_tm.tm_hour = atoi(buf); strncpy(buf, tstr+4+2+2+2, 2); work_tm.tm_min = atoi(buf); strncpy(buf, tstr+4+2+2+2+2, 2); work_tm.tm_sec = atoi(buf); work_tm.tm_isdst = -1; if((cal_time=mktime(&work_tm)) == -1){ return(-1); } return(cal_time); } |
stime: 20041125173530 etime: 20041125173535 経過時刻1: 00時間00分05秒 経過時刻2: 36日00時間01分10秒 |