【C言語】
localtime関数を使って誕生日から今までの経過年月日を表示する方法

■この記事の概要

この記事では、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

コピペしコンパイル&実行し、
動作確認をして下さい。

参考:localtime