【C言語】time関数|通算秒、UTC、JST時刻を取得するプログラム

プログラマのメモ帳

この記事では、C言語のtime関数を使って次の値を取得するプログラムを紹介しています。
・通算秒/UNIX時間(1970年1月1日00:00:00からの経過秒数)
・UTC/協定世界時(UTC+0000)
・JST/日本標準時(UTC+0900)

通算秒については、UTC時刻とJST時刻のどちらを取得する際にも使用します。

まずは、共通で必要になるデータ型と構造体についてまとめたあとでUTC時刻、JST時刻の取得するサンプルプログラムという順番で紹介します。

スポンサーリンク

共通事項(データ型、構造体)

データ型であるtime_t型と構造体である tm についてまとめます。どちらも標準の<time.h>ヘッダファイルで定義されています。

 time_t型

符号付の整数を表しており、通算秒を格納します。処理系に依存して32ビットまたは64ビットで定義されます。

構造体 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;      /* 月 (1月始まり:0~11) */
  int tm_year;     /* 年 (1900年始まり:0~) */
  int tm_wday;     /* 曜日 (日曜日始まり:0~6) */
  int tm_yday;     /* 経過日数(1月1日始まり:0~365) */
  int tm_isdst;    /* 夏時間のフラグ値 採用:正の値 不採用:0 不明:負の値 */
};

Sample Code

UTC/協定世界時の取得

#include <time.h>
#include <stdio.h>

int main(void)
{
  char* week[] = {"日", "月", "火", "水", "木", "金", "土"};
  time_t t;
  struct tm* utcTm; //time構造体

  /* UTC/協定世界時で出力 */
  time(&t);  //通算秒の取得
  printf("通算秒(t) >> %ld\n", t);
  utcTm = gmtime(&t);  //UTC協定世界時を取得
  printf("%04d/%02d/%02d(%s) %02d:%02d:%02d 経過日数:%d 夏時間フラグ:%d\n",
    utcTm->tm_year + 1900,
    utcTm->tm_mon + 1,
    utcTm->tm_mday,
    week[utcTm->tm_wday],
    utcTm->tm_hour,
    utcTm->tm_min,
    utcTm->tm_sec,
    utcTm->tm_yday,
    utcTm->tm_isdst );

  return 0;
}

実行結果するとこんな感じで表示されます。

紹介すべき関数は次の2つです。

time_t time(time_t *t);

time_t型で定義した変数のポインタを渡すことで通算秒が渡した変数に格納されます。

struct tm *gmtime(const time_t *timer);

UTC時刻を取得する関数です。引数にはtime_t型のポインタ、戻り値にはUTC時刻の情報が格納された構造体tmのポインタが返ってきます。

JST/日本標準時

#include <time.h>
#include <stdio.h>

int main(void)
{
  char* week[] = {"日", "月", "火", "水", "木", "金", "土"};
  time_t t;
  struct tm* jstTm; //time構造体

  /* JST/日本標準時で出力 */
  time(&t); //通算秒の取得
  printf("通算秒(t) >> %ld\n", t);
  jstTm = localtime(&t); //JST日本標準時を取得
  printf("%04d/%02d/%02d(%s) %02d:%02d:%02d 経過日数:%d 夏時間フラグ:%d\n",
    jstTm->tm_year + 1900,
    jstTm->tm_mon + 1,
    jstTm->tm_mday,
    week[jstTm->tm_wday],
    jstTm->tm_hour,
    jstTm->tm_min,
    jstTm->tm_sec,
    jstTm->tm_yday,
    jstTm->tm_isdst );

  return 0;
}

実行結果です。

紹介すべきは次の関数です。

struct tm * localtime(const time_t *timer);

JST時刻を取得する関数です。引数にはtime_t型のポインタ、戻り値にはJST時刻の情報が格納された構造体tmのポインタが返ってきます。

1時間後の時刻を取得するには?

もし、1時間後の時刻を取得したい場合にはtime(&t)で取得した通算秒に3600秒(1時間)を加算してあげれば取得できます。求めたい時刻の秒数を足したり、引いたりして取得が可能です。

紹介は以上です。
参考になればうれしいです。

コメント

タイトルとURLをコピーしました