質問: ### 前提・実現したいこと strftime関数を使用し年月日を表示させたい ### 発生している問題・エラーメッセージ 本来 **2012年01月01日**と表示されるべきですが、 **3912年02月01日**と表示されます。 ### 該当のソースコード ``` #include #include #include #include #include #include void mjd2data(int mjd, struct tm *data){ int n, a, b; n=mjd+678881; //printf("n=%d",n); a=4*n +3 +4*floor( 3/4.0* floor( 4*(n+1)/146067.0 ) ); b=5*floor(a%1461/4.0 )+2; data->tm_year=floor(a/1461.0); data->tm_mon =floor(b/153.0)+3; data->tm_mday=floor(b%153/5.0)+1; if(12 < data->tm_mon ){ data->tm_year+=1; data->tm_mon-=12; } } void main(){ int mjd; struct tm data; char dc[64]={}; scanf("%d",&mjd); mjd2data(mjd,&data); puts("hoge"); printf("%4d/", data.tm_year); printf("%2d/", data.tm_mon); printf("%2d \n", data.tm_mday); data.tm_hour=0; data.tm_isdst=0; data.tm_min=0; data.tm_sec=0; data.tm_wday=0; data.tm_yday=0; strftime(dc, 64, "%Y年%m月%d日", &data); printf("%s\n",dc); } ``` ### 試したこと tm構造体にて数値を代入していない部分があるので、そこをとりあえず0で埋めたら何か変化があるかなと思ったが、特になかった。 なお、直にメンバにアクセスしての表示も併記しているがこれは想定通りの挙動を取っている。 ↓0で埋めている ``` data.tm_hour=0; data.tm_isdst=0; data.tm_min=0; data.tm_sec=0; data.tm_wday=0; data.tm_yday=0; ``` ### 補足情報(FW/ツールのバージョンなど) Win10 MinGW
回答: int tm_year; /* 年 (年 - 1900) */ ですね。 C言語ケーススタディ 日付/時刻の操作 ``` struct tm { int tm_sec; /* 秒 (0から59) */ int tm_min; /* 分 (0から59) */ int tm_hour; /* 時 (0から23) */ int tm_mday; /* 日 (1から31) */ int tm_mon; /* 月 (0から11) */ int tm_year; /* 年 (年 - 1900) */ int tm_wday; /* 週 (0から6 : 0が日曜日 */ int tm_yday; /* 年内の経過日数 (0から365) */ int tm_isdst; /* 夏時間 : 0以外の値 */ }; ``` あ、こっちだ。 tm - cppreference.com