C言語ケーススタディ 日時文字列からカレンダー時刻への変換




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を強力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



キーボードなどから入力した文字列は、カレンダー時刻に変換すると比較などの 操作が簡単に行えるようになります。C言語の標準関数には文字列から直接 カレンダー時刻に変換する関数は用意されていませんが、mktime()関数で tm構造体にセットされた値をカレンダー時刻に変換することができます。 ちょうどlocaltime()関数の逆の働きをします。
#include <stdio.h>
#include <time.h>


main()
{
        time_t  cal_time;
        struct tm
                work_tm;

        work_tm.tm_year = 1999 - 1900;
        work_tm.tm_mon = 2 - 1;
        work_tm.tm_mday = 11;
        work_tm.tm_hour = 12;
        work_tm.tm_min = 13;
        work_tm.tm_sec = 14;
        work_tm.tm_isdst = -1;
        if((cal_time = mktime(&work_tm)) == -1){
                printf("変換失敗\n");
                return(-1);
        }
        printf("変換結果 : %d\n", cal_time);
        printf("CTIME = %s", ctime(&cal_time));
        return(0);
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...
ctime()関数の結果は"Thu Feb 11 12:13:14 1999"となります。 前回説明したとおり、tm構造体のyearは1900をtm_monは1を減算した値を設定する 必要があるので注意して下さい。また、変換失敗に付いては別のケーススタディで 説明します。
 あとは文字列で入力された日時をtm構造体に代入する部分を作成すれば、文字列 からカレンダー時刻への変換が完成します。文字列から数字への変換はstrtol()関数 などを使用してエラーチェックまでするべきですが、ここではatoi()関数で簡単に すませています。
#include <stdio.h>
#include <time.h>


main()
{
        char    buf[20];
        time_t  cal_time;
        struct tm
                work_tm;
        char    *tstr;

        tstr = "19990213141516";

        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){
                printf("変換失敗\n");
                return(-1);
        }
        printf("変換結果 : %d\n", cal_time);
        printf("CTIME = %s", ctime(&cal_time));
        return(0);
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...
 これが変換部の中心となるプログラムですが、このままでは使いにくいので 変換関数として作り替えます。
#include <stdio.h>
#include <time.h>

time_t  get_caltime(char *tstr);


main()
{
        time_t  cal_time;
        char    buff[100];

        printf("YYYYMMDDHHMMSS : ");
        scanf("%s", buff);
        cal_time = get_caltime(buff);
        if(cal_time == -1)
                printf("変換失敗\n");
        else
                printf("変換結果 : %d\nCTIME = %s", cal_time, ctime(&cal_time));
}


time_t  get_caltime(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);
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...