+int isLeapYear(int year) {
+ return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
+int monthDays(int month, int year) {
+ int month_days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+ return month == 2 && isLeapYear(year) ? 29 : month_days[month - 1];
+int daysBetween(int start_month, int start_day, int start_year, int end_month,
+ int end_day, int end_year) {
+ // sanitize month inputs
+ if (start_month < 1) start_month = 1;
+ if (end_month < 1) end_month = 1;
+ if (start_month > 12) start_month = 12;
+ if (end_month > 12) end_month = 12;
+ if (start_day < 1) start_day = 1;
+ if (end_day < 1) end_day = 1;
+ if (start_day > monthDays(start_month, start_year))
+ start_day = monthDays(start_month, start_year);
+ if (end_day > monthDays(end_month, end_year))
+ end_day = monthDays(end_month, end_year);
+ // swap dates if start date before end date
+ if (end_year < start_year) {
+ if (end_year == start_year) {
+ if (end_month < start_month) {
+ if (end_year == start_year) {
+ if (end_month == start_month) {
+ if (end_day < start_day) {
+ end_month = start_month;
+ if (start_month == end_month) {
+ if (start_year == end_year) {
+ days = end_day - start_day;
+ days += monthDays(start_month, start_year) - start_day;
+ if (start_year == end_year) {
+ int month = start_month + 1;
+ while (month < end_month) {
+ days += monthDays(month, start_year);
+ int month = start_month + 1;
+ days += monthDays(month, start_year);
+ while (month < end_month) {
+ days += monthDays(month, end_year);
+ while (year < end_year) {
+ if (isLeapYear(year)) days++;