最近有个脚本需要将日期进行加减,但是必须用C语言,找了一些,虽然有库函数,但还是想自己实现一个,话不多说,上代码:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
typedef stuct {
int year;
int month;
int day;
} my_time_t;
/* 检查年月日是否合法 */
void check_date(int year, int month, int day)
{
if (year< 0 || year > 9999) {
printf("year must be in [0 - 9999]\n");
exit(-1);
}
if (month <= 0 || month > 12) {
printf("month must be in [01 - 12]\n");
exit(-1);
}
int max_month_day = month_days(year, month);
if (day <= 0 || day > max_month_day) {
printf("day must be in [01 - %d]\n", max_month_day);
exit(-1);
}
}
/* 返回每个月的最大天数 */
int month_days(int year, int month)
{
// 闰年每个月的最大天数
int leap_month_days[] = {31, 29, 31,30, 31, 30, 31, 31, 30, 31, 30, 31};
// 其他年份每个月最大天数
int unleap_month_days[] = {31, 28, 31,30, 31, 30, 31, 31, 30, 31, 30, 31};
if ((0 == year % 4 && 0 != year % 100)
|| (0 == year % 400))
{
return leap_month_days[month + 1];
} else {
return unleap_month_days[month + 1];
}
}
/* 给定日期增加/减少指定天数 */
my_time_t add_day(const my_time_t *tm, int day)
{
my_time_t ret;
ret.year = tm->year;
ret.month = tm->month;
ret.day = tm->day;
/* 检查年月日是否合法 */
check_date(tm->year, tm->month, tm->day);
if (0 == day) {
return ret;
} else if (day > 0) {
int i = 0;
for (i = 0; i < day; i++) {
ret.day = ret.day + 1;
int month_days = month_days(ret.year, ret.month);
if (ret.day > month_days) {
ret.month = ret.month + 1;
if (ret.month > 12) {
ret.month = ret.month % 12;
ret.year = ret.year + 1;
}
ret.day = ret.day - month_days;
}
}
} else {
int i = 0;
for (i = 0; i < -day ; i++) {
ret.day = ret.day - 1;
if (ret.day <= 0) {
ret.month = ret.month - 1;
if (ret.month <= 0) {
ret.year = ret.year - 1;
ret.month = ret.month + 12;
}
ret.day = ret.day + month_days(ret.year, ret.month);
}
}
}
return ret;
}