
■標準関数localtimeの使い方
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
void 日付差分を年月日変換(
struct tm *誕,
struct tm *今,
int *A年差,
int *A月差,
int *A日差)
{
// 年数の計算
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};
先月の日数 = 月別日数[先月];
}
日差 += 先月の日数;
月差--;
}
*A年差 = 年差;
*A月差 = 月差;
*A日差 = 日差;
}
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);
}
遊び方
$./a.out 1998/08/10
コピペしコンパイル&実行し、
動作確認をして下さい。