時間を扱うには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;
}