LoginSignup
28
24

More than 5 years have passed since last update.

[C言語] 時間を扱う

Posted at

時間を扱うにはtime()関数などを利用します。

関数

time関数

引数のtimerに、暦時刻を格納します。時刻はグリニッチ標準時(GMT)の1970年 1月 1日の00:00:00 から現在までの経過時間を秒単位です。(エポック秒)
(戻り値も同じものを指します)

NULLを指定すると戻り値を返却するのみとなります。

#include <time.h>

time_t time(time_t *timer);

mktime関数

#include <time.h>

time_t mktime(struct tm *timeptr);

引数で渡されたstruct tm構造体の情報を元に、1970/1/1 0:00:00からの経過秒数を返します。
struct tm構造体はtime.hの中で以下のように宣言されています。

構造体 tm time.h の中で宣言され、以下の情報を含みます
struct tm {
  int tm_sec;      /* 秒 [0-61] 最大2秒までのうるう秒を考慮 */
  int tm_min;      /* 分 [0-59] */
  int tm_hour;     /* 時 [0-23] */
  int tm_mday;     /* 日 [1-31] */
  int tm_mon;      /* 月 [0-11] 0から始まることに注意 */
  int tm_year;     /* 年 [1900からの経過年数] */
  int tm_wday;     /* 曜日 [0:日 1:月 ... 6:土] */
  int tm_yday;     /* 年内の通し日数 [0-365] 0から始まることに注意*/
  int tm_isdst;    /* 夏時間フラグ [夏時間を採用しているときに正、採用していないときに 0、この情報が得られないときに負] */
};

difftime関数

#include <time.h>

double difftime(time_t time2, time_t time1);

time1からtime2までの時間差を秒数で返します。

localtime関数

#include <time.h>

struct tm *localtime(const time_t *timer);

timerに格納されているデータを現地時間(日本時間)に変換し、tm構造体に格納します。

asctime関数

#include <time.h>

char *asctime(const struct tm *tblock);

tblock構造体の時刻を文字列に変換します。

サンプル

とある日付から経過秒数を取得するサンプルです。

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

int main() {

    char *sample = "2015年04月15日00時43分";
    int year;
    int month;
    int hour;
    int day;
    int min;
    sscanf(sample, "%04d年%02d月%02d日%02d時%02d分", &year, &month, &day, &hour, &min);

    struct tm sampleDate;
    sampleDate.tm_sec   = 0;
    sampleDate.tm_min   = min;
    sampleDate.tm_hour  = hour;
    sampleDate.tm_mday  = day;
    sampleDate.tm_mon   = month - 1;
    sampleDate.tm_year  = year - 1900;
    sampleDate.tm_isdst = -1;

    time_t time = mktime(&sampleDate);

    printf("time: %ld\n", time);

    return 0;
}
28
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
24