■この記事の概要
この記事では、C言語のlocaltime
関数を使い、誕生日から現在までの経過年月日を計算・表示するプログラムを解説しています。
struct tm
を使用し、年・月・日ごとの経過時間を算出する方法が紹介されています。
■誕生日から今までの経過年月日を表示
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
void 日付差分を年月日変換(
struct tm *誕,
struct tm *今,
int *年差結果,
int *月差結果,
int *日差結果)
{
// 年数の計算
int 年差 = 今->tm_year - 誕->tm_year;
// 月数の計算
int 月差 = 今->tm_mon - 誕->tm_mon;
if (月差 < 0) {
月差 += 12;
年差--;
}
// 日数の計算
int 日差 = 今->tm_mday - 誕->tm_mday;
if (日差 < 0) {
int 先月 = 今->tm_mon - 1;
if (先月 < 0) {
先月 += 12;
年差--;
}
int 先月の日数;
if (先月 == 1 && __isleap(今->tm_year)) {
先月の日数 = 29; // 閏年の場合は2月は29日
} else {
int 月別日数[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
先月の日数 = 月別日数[先月];
}
日差 += 先月の日数;
月差--;
}
*年差結果 = 年差;
*月差結果 = 月差;
*日差結果 = 日差;
}
int main(int argc,char *argv[]) {
if(argc != 2){
printf("引数に yyyy/mm/dd形式で生年月日を指定して下さい\n");
fflush(NULL);
exit(1);
}
int year,mon,day;
int ret =sscanf(argv[1],"%04d/%02d/%02d",&year,&mon,&day);
if(ret != 3){
printf("引数に yyyy/mm/dd形式で誕生日を指定して下さい\n");
fflush(NULL);
exit(1);
}
struct tm 誕生日_tm ={
.tm_mday = day, /* 日 */
.tm_mon = mon-1, /* 月 ( 1月=0 ) */
.tm_year = year-1900, /* 西暦年 - 1900 */
};
// 今の時間
time_t t = time(NULL);
struct tm *今_tm = localtime(&t);
// 年月日に変換
日付差分を年月日変換(&誕生日_tm,今_tm,&year, &mon, &day);
// 結果を表示
printf("誕生から: %d年%dか月と%d日\n", year, mon, day);
}
貴方の誕生日をyyyy/mm/ddの形式で指定して下さい。
誕生日からの経過年月日を表示します。
遊び方の例
$./a.out 1998/08/10
コピペしコンパイル&実行し、
動作確認をして下さい。