経過時刻の出力

経過時刻の出力例です。計算が数日にも及んでしまう際等に何日経過したかを書式付で出力することができます。計算例では、"20041125172211"のように、2004:年,11:月,25:日,17:時,22:分,11:秒を記したテキストから経過時刻を計算しています。

経過時刻の出力(list_32.c)
//-----------------------------------------------------------------
// 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);
}

result
    stime: 20041125173530
    etime: 20041125173535
経過時刻1: 00時間00分05秒
経過時刻2: 36日00時間01分10秒
inserted by FC2 system