C言語ケーススタディ 日付/時刻の操作




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



 前回はctime()関数で文字列を生成しましたが、これではプログラムで日時を扱うには 適していません。今回はまず、カレンダー時刻から日時の各要素を求めるlocaltime()関数 を使用します(グリニッジ時刻から日本時間への変換も行います)。localtime()関数は カレンダー時刻を年/月/日 時:分:秒の各要素に分解しtm構造体にセットします。tm構造体は time.hに定義されているので、必ずインクルードしておく必要があります。
 tm構造体は次のように定義されています。
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から11) */
        int     tm_year;        /* 年 (年 - 1900) */
        int     tm_wday;        /* 週 (0から6 : 0が日曜日 */
        int     tm_yday;        /* 年内の経過日数 (0から365) */
        int     tm_isdst;       /* 夏時間 : 0以外の値 */
};
これが、tm構造体の定義です。tm_year、tm_mon、tm_mday、tm_hour、tm_min、tm_secの 各メンバは名前から類推される通り年月日時分秒を格納します。tm_wdayは曜日、tm_yday は年の初めから何日経過したか、tm_isdstは夏時間の識別に使用します。 これらの中でtm_ydayとtm_isdstはほとんど使用しないと思います。
 次のプログラムで各要素の値を観察してみましょう。
#include <stdio.h>
#include <time.h>


main()
{
        time_t  now;
        struct tm
                *tm_now;

        now = time(NULL);
        tm_now = localtime(&now);
        printf("%d/%d/%d - %d:%d:%d   %d, %d, %d\n",
                tm_now->tm_year, tm_now->tm_mon, tm_now->tm_mday,
                tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec,
                tm_now->tm_wday, tm_now->tm_yday, tm_now->tm_isdst);
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...
このプログラムを実行すると"99/1/10 - 17:32:56 6, 36, 0"のような 値が表示されます。年と月の項目がそのままでは使用できません。 tm_yearは1900を加え、tm_monは1を加える必要があります。
 次のプログラムは各項目の値を調節して、曜日も文字列で表示するように したものです。
#include <stdio.h>
#include <time.h>


main()
{
        static char
                *week[] = {"日", "月", "火", "水", "木", "金", "土"};
        time_t  now;
        struct tm
                *tm_now;

        now = time(NULL);
        tm_now = localtime(&now);
        printf("%d年%d月%d日 - %d時%d分%d秒  %s曜日\n"
                "1月1日から%d日経過しています\n%s\n",
                tm_now->tm_year+1900, tm_now->tm_mon+1, tm_now->tm_mday,
                tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec,
                week[tm_now->tm_wday], tm_now->tm_yday,
                tm_now->tm_isdst==1?"夏時間":"夏時間ではありません");
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...
localtime()でセットされたデータをctime関数で変換したのと同じ形式の文字列に 変換するasctime()という関数も用意されています。あまり使わないかもしれません が、使用例を次に示します。
#include <stdio.h>
#include <time.h>


main()
{
        time_t  now;
        struct tm
                *tm_now;

        now = time(NULL);
        tm_now = localtime(&now);
        printf("<<<%s>>>\n", asctime(tm_now));
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...


[an error occurred while processing this directive]