「現在時刻を取得したい」
「自分で実装したい」
そんな方の疑問に答えます。
<time.h>の構造体の中に現時刻の情報が入っており、
time_t t = time(NULL);
printf("%s", ctime(&t));
上の2行で表示できます。
しかし、私は自分で現時刻の表示するプログラムを書きたかったので実装してみました!実装してみると、グリニッジ標準時など、意外といろんな知識を得ることが出来ました。興味のある方はぜひ!
コードが知りたい方は目次のソースコードへ飛んでください!
本記事のテーマ
【完全初心者向け】現在時刻を計算する方法を理解する!
現在時刻の取得!
条件
・日本時間JSTを表示する
アルゴリズム
現在時刻を取得
1. 現在時刻(秒)を取得
2. 60で割った余り=秒
3. 年月日時分を計算する
現在時刻の取得プログラム実装!
struct current_time_st{
int sec;
int min;
int hour;
int day;
int month;
int year;
};
sec, min, hourの計算
←現在時刻(秒)の取得
2. current_t->sec = t % 60;
←60で割った余り=秒
3. t_tmp = t / 60;
←余り(sec)を除いた現時刻を格納
4. current_t->min = t_tmp % 60;
←60で割った余り=分
5. t_tmp = t_tmp / 60;
←余り(min)を除いた現時刻を格納
6. current_t->hour = t_tmp % 24 + 9;
←24で割った余り+9=時(日本)
7. t_tmp = t_tmp / 24;
←余り(hour)を除いた現時刻を格納
yearの計算
まずここで、time()関数は1970年1月1日から数えた秒が返ってくる。
現時刻が一年以内(365日)になるまで現時刻を減らしていく
・閏年 : -366
・他の年: -365
ループ内でyear=1970から1を足し続けていき、365日以内なればループを抜ける処理を行う!
while(t_tmp > 365){
if(judge_leap_year(year)){
t_tmp -= 366;
}
else{
t_tmp -=365;
}
year++;
}
current_t->year = year;
month, dayの計算!
まず、各月の日数を格納した配列を宣言する
閏年なら2月の日数を+1する
int month_daynum_array[] ={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if(judge_leap_year(year)){
month_daynum_array[1]++;
}else{
//do nothing
}
日数が0より大きい間、一月の日数を引いていく
int i;
for(i=0; i<12; i++){
if(t_tmp - month_daynum_array[i] > 0){
t_tmp -= month_daynum_array[i];
}
else{
break;
}
}
ループ内でyear=1970から1を足し続けていき、365日以内なればループを抜ける処理を行う!
while(t_tmp > 365){
if(judge_leap_year(year)){
t_tmp -= 366;
}
else{
t_tmp -=365;
}
year++;
}
current_t->year = year;
出力
---japan time---
current time is:
2019年 6月 10日 21時 26分 7秒
完成です!
現在時刻の計算プログラムを実装しました。
タイマーやリアルタイム処理のプログラムを作る際には必須の知識です。
一度自分でコードを組むことで、今後time関数を使う時にいろんな使い方を考えることが出来ます。
ぜひ自分で作ってみましょう!
main文を含む全ソースコードは以下の記事に示します。
ソースコード