C两个日期之间的计划天数
我已经写了一个程序,可以找到两个日期之间的天数,但是它有一些问题。当我通读它的时候,逻辑在我的头脑中是非常有意义的,所以我假设我有一些语法错误,我一直在浏览或做其他事情 首先,当输入不同年份的两个日期时,输出总是相差约一个月(大多数情况下为31个月,但有一种情况下为32个月…如图所示)。其次,两个相隔一个月的日期将返回第二个月的天数(即1/1/1到2/1/1)。这个程序不可避免地会做一些其他奇怪的事情,但我希望这些信息足以帮助你们找出我做错了什么。就我个人而言,我无法独自解决这个问题。我对C比较陌生,所以请温柔点=) 谢谢C两个日期之间的计划天数,c,C,我已经写了一个程序,可以找到两个日期之间的天数,但是它有一些问题。当我通读它的时候,逻辑在我的头脑中是非常有意义的,所以我假设我有一些语法错误,我一直在浏览或做其他事情 首先,当输入不同年份的两个日期时,输出总是相差约一个月(大多数情况下为31个月,但有一种情况下为32个月…如图所示)。其次,两个相隔一个月的日期将返回第二个月的天数(即1/1/1到2/1/1)。这个程序不可避免地会做一些其他奇怪的事情,但我希望这些信息足以帮助你们找出我做错了什么。就我个人而言,我无法独自解决这个问题。我对C比较
// Calculates the number of calendar days between any two dates in history (beginning with 1/1/1).
#include <stdio.h>
#include <stdlib.h>
void leap(int year1, int year2, int *leap1, int *leap2);
void date(int *month1, int *day1, int *year1, int *month2, int *day2, int *year2, int *leap1, int *leap2);
int main(void)
{
int month1, day1, year1, month2, day2, year2, leap1, leap2;
int daysPerMonth[] = {31,28,31,30,31,30,31,31,30,31,30,31};
int daysPerMonthLeap[] = {31,29,31,30,31,30,31,31,30,31,30,31};
leap(year1, year2, &leap1, &leap2);
date(&month1, &day1, &year1, &month2, &day2, &year2, &leap1, &leap2);
if(year1 == year2)
{
int i, total;
if(month1 == month2) // Total days if month1 == month2
{
total = day2 - day1;
printf("There are %d days between the two dates.", total);
}
else
{
if(leap1 == 1)
total = daysPerMonthLeap[month1] - day1;
else
total = daysPerMonth[month1] - day1;
for(i = month1 + 1; i < month2; i++) // Days remaining between dates (excluding last month)
{
if(leap1 == 1)
total += daysPerMonthLeap[i];
else
total += daysPerMonth[i];
}
total += day2; // Final sum of days between dates (including last month)
printf("There are %d days between the two dates.", total);
}
}
else // If year1 != year2 ...
{
int i, total, century1 = ((year1 / 100) + 1) * 100, falseleap = 0;
if(leap1 == 1)
total = daysPerMonthLeap[month1] - day1;
else
total = daysPerMonth[month1] - day1;
for(i = month1 + 1; i <= 12; i++) // Day remaining in first year
{
if(leap1 == 1)
total += daysPerMonthLeap[i];
else
total += daysPerMonth[i];
}
for(i = 1; i < month2; i++) // Days remaining in final year (excluding last month)
{
if(leap2 == 1)
total += daysPerMonthLeap[i];
else
total += daysPerMonth[i];
}
int leapcount1 = year1 / 4; // Leap years prior to and including first year
int leapcount2 = year2 / 4; // Leap years prior to and NOT including final year
if(year2 % 4 == 0)
leapcount2 -= 1;
int leaptotal = leapcount2 - leapcount1; // Leap years between dates
for(i = century1; i < year2; i += 100) // "False" leap years (divisible by 100 but not 400)
{
if((i % 400) != 0)
falseleap += 1;
}
total += 365 * (year2 - year1 - 1) + day2 + leaptotal - falseleap; // Final calculation
printf("There are %d days between the two dates.", total);
}
return 0;
}
void leap(int year1, int year2, int *leap1, int *leap2) // Determines if first and final years are leap years
{
if(year1 % 4 == 0)
{
if(year1 % 100 == 0)
{
if(year1 % 400 == 0)
*leap1 = 1;
else
*leap1 = 0;
}
else
*leap1 = 1;
}
else
*leap1 = 0;
if(year2 % 4 == 0)
{
if(year2 % 100 == 0)
{
if(year2 % 400 == 0)
*leap2 = 1;
else
*leap2 = 0;
}
else
*leap2 = 1;
}
else
*leap2 = 0;
}
void date(int *month1, int *day1, int *year1, int *month2, int *day2, int *year2, int *leap1, int *leap2)
{
for(;;) // Infinite loop (exited upon valid input)
{
int fail = 0;
printf("\nEnter first date: ");
scanf("%d/%d/%d", month1, day1, year1);
if(*month1 < 1 || *month1 > 12)
{
printf("Invalid entry for month.\n");
fail += 1;
}
if(*day1 < 1 || *day1 > 31)
{
printf("Invalid entry for day.\n");
fail += 1;
}
if(*year1 < 1)
{
printf("Invalid entry for year.\n");
fail += 1;
}
if(daysPerMonth[month1] == 30 && *day1 > 30)
{
printf("Invalid month and day combination.\n");
fail += 1;
}
if(*month1 == 2)
{
if(*leap1 == 1 && *day1 > 29)
{
printf("Invalid month and day combination.\n");
fail += 1;
}
else if(*day1 > 28)
{
printf("Invalid month and day combination.\n");
fail += 1;
}
}
if(fail > 0)
continue;
else
break;
}
for(;;)
{
int fail = 0;
printf("\nEnter second date: ");
scanf("%d/%d/%d", month2, day2, year2);
if(*year1 == *year2)
{
if(*month1 > *month2)
{
printf("Invalid entry.\n");
fail += 1;
}
if(*month1 == *month2 && *day1 > *day2)
{
printf("Invalid entry.\n");
fail += 1;
}
}
if(*month2 < 1 || *month2 > 12)
{
printf("Invalid entry for month.\n");
fail += 1;
}
if(*day2 < 1 || *day2 > 31)
{
printf("Invalid entry for day.\n");
fail += 1;
}
if(*year2 < 1)
{
printf("Invalid entry for year.\n");
fail += 1;
}
if(daysPerMonth[month2] == 30 && *day2 > 30)
{
printf("Invalid month and day combination.\n");
fail += 1;
}
if(*month2 == 2)
{
if(*leap2 == 1 && *day2 > 29)
{
printf("Invalid month and day combination.\n");
fail += 1;
}
else if(*day2 > 28)
{
printf("Invalid month and day combination.\n");
fail += 1;
}
}
if(fail > 0)
continue;
else
break;
}
}
//计算历史上任意两个日期之间的日历天数(从1/1/1开始)。
#包括
#包括
无效跳跃(int year1、int year2、int*leap1、int*leap2);
无效日期(整数*月1日,整数*日1日,整数*年1日,整数*月2日,整数*年2日,整数*年1日,整数*年2日,整数*年1日,整数*年2日);
内部主(空)
{
int month1,day1,year1,month2,day2,year2,leap1,leap2;
int daysPerMonth[]={31,28,31,30,31,30,31,31,30,31};
int daysPerMonthLeap[]={31,29,31,30,31,30,31,31,30,31};
leap(第1年、第2年、第1年和第2年);
日期(&month1,&day1,&year1,&month2,&day2,&year2,&leap1,&leap2);
如果(第1年==第2年)
{
int i,总计;
if(month1==month2)//如果month1==month2,则总天数
{
总计=第2天-第1天;
printf(“两个日期之间有%d天。”,总计);
}
其他的
{
如果(1==1)
总计=daysPerMonthLeap[月1]-第1天;
其他的
总计=日/月[月1]-第1天;
对于(i=month1+1;i31)
{
printf(“日期的无效条目。\n”);
失败+=1;
}
如果(*1年<1年)
{
printf(“年度的无效条目。\n”);
失败+=1;
}
如果(daysPerMonth[月1]==30&&*day1>30)
{
printf(“无效的月和日组合。\n”);
失败+=1;
}
如果(*month1==2)
{
如果(*leap1==1&&*day1>29)
{
printf(“无效的月和日组合。\n”);
失败+=1;
}
否则,如果(*第1天>28天)
{
printf(“无效的月和日组合。\n”);
失败+=1;
}
}
如果(失败>0)
继续;
其他的
打破
}
对于(;;)
{
int fail=0;
printf(“\n输入第二个日期:”);
scanf(“%d/%d/%d”,month2,day2,year2);
如果(*year1==*year2)
{
如果(*month1>*month2)
{
printf(“无效条目。\n”);
失败+=1;
}
如果(*month1==*month2&*day1>*day2)
{
printf(“无效条目。\n”);
失败+=1;
}
}
如果(*月2<1 | |*月2>12)
{
printf(“月份的无效条目。\n”);
失败+=1;
}
如果(*第2天<1 |*2天>31)
{
printf(“日期的无效条目。\n”);
失败+=1;
}
如果(*第2年<1年)
{
printf(“年度的无效条目。\n”);
失败+=1;
}
如果(daysPerMonth[月2]==30&&*day2>30)
{
printf(“无效的月和日组合。\n”);
失败+=1;
}
如果(*month2==2)
{
如果(*leap2==1&&*day2>29)
{
printf(“无效的月和日组合。\n”);
失败+=1;
}
如果(*day2>
int is_leap_year(int year) {
if (year % 400 == 0) {
return 1;
} else if (year % 100 == 0) {
return 0;
} else if (year % 4 == 0) {
return 1;
} else {
return 0;
}
}
int year1, year2, leap1, leap2;
year1 = get_input();
year2 = get_input();
leap1 = is_leap_year(year1);
leap2 = is_leap_year(year2);
if(*month1 < 1 || *month1 > 12)
int daysPerMonth[] = {31,28,31,30,31,30,31,31,30,31,30,31};
int days_in_month(int month, int year) {
int leap = is_leap_year(year);
/* J F M A M J J A S O N D */
int days[2][12] = {{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
if (month < 0 || month > 11 || year < 1753)
return -1;
return days[leap][month];
}
for(i = month1 + 1; i <= 12; i++)
{
if(leap1 == 1)
total += daysPerMonthLeap[i];
if ((year % 4 == 0 && year % 100 != 0) || year % 400 ==0)
printf("%d is a leap year \n", year);
else
printf("%d is not a leap year \n", year);
int daysPerMonth[] = {31,28,31,30,31,30,31,31,30,31,30,31};
int daysPerMonthLeap[] = {31,29,31,30,31,30,31,31,30,31,30,31};
int daysPerMonth[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int daysPerMonthLeap[] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
#include <stdio.h>
#include <stdlib.h>
char *month[13] = {"None", "Jan", "Feb", "Mar",
"Apr", "May", "June", "July",
"Aug", "Sept", "Oct",
"Nov", "Dec"};
/*
daysPerMonth[0] = non leap year
daysPerMonth[1] = leap year
*/
int daysPerMonth[2][13] = {{-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{-1, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
typedef struct _d {
int day; /* 1 to 31 */
int month; /* 1 to 12 */
int year; /* any */
}dt;
void print_dt(dt d)
{
printf("%d %s %d \n", d.day, month[d.month], d.year);
return;
}
int leap(int year)
{
return ((year % 4 == 0 && year % 100 != 0) || year % 400 ==0) ? 1 : 0;
}
int minus(dt d1, dt d2)
{
int d1_l = leap(d1.year), d2_l = leap(d2.year);
int y, m;
int total_days = 0;
for (y = d1.year; y >= d2.year ; y--) {
if (y == d1.year) {
for (m = d1.month ; m >= 1 ; m--) {
if (m == d1.month) total_days += d1.day;
else total_days += daysPerMonth[leap(y)][m];
// printf("%d - %5s - %d - %d \n", y, month[m], daysPerMonth[leap(y)][m], total_days);
}
} else if (y == d2.year) {
for (m = 12 ; m >= d2.month ; m--) {
if (m == d2.month) total_days += daysPerMonth[leap(y)][m] - d2.day;
else total_days += daysPerMonth[leap(y)][m];
// printf("%d - %5s - %d - %d \n", y, month[m], daysPerMonth[leap(y)][m], total_days);
}
} else {
for (m = 12 ; m >= 1 ; m--) {
total_days += daysPerMonth[leap(y)][m];
// printf("%d - %5s - %d - %d \n", y, month[m], daysPerMonth[leap(y)][m], total_days);
}
}
}
return total_days;
}
int main(void)
{
/* 28 Oct 2018 */
dt d2 = {28, 10, 2018};
/* 30 June 2006 */
dt d1 = {30, 6, 2006};
int days;
int d1_pt = 0, d2_pt = 0;
if (d1.year > d2.year) d1_pt += 100;
else d2_pt += 100;
if (d1.month > d2.month) d1_pt += 10;
else d2_pt += 10;
if (d1.day > d2.day) d1_pt += 1;
else d2_pt += 1;
days = (d1_pt > d2_pt) ? minus(d1, d2) : minus(d2, d1);
print_dt(d1);
print_dt(d2);
printf("number of days: %d \n", days);
return 0;
}
$ gcc dates.c
$ ./a.out
30 June 2006
28 Oct 2018
number of days: 4503
$
//Difference/Duration between two dates
//No need to calculate leap year offset or anything
// Author: Vinay Kaple
# include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
int days_add, days_sub, c_date, c_month, b_date, b_month, c_year, b_year;
cout<<"Current Date(dd mm yyyy): ";
cin>>c_date>>c_month>>c_year;
cout<<"Birth Date(dd mm yyyy): ";
cin>>b_date>>b_month>>b_year;
int offset_month[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
days_add = c_date + offset_month[c_month-1];
days_sub = b_date + offset_month[b_month-1];
int total_days = (c_year-b_year)*365.2422 + days_add - days_sub+1;
cout<<"Total days: "<<total_days<<"\n";
int total_seconds = total_days*24*60*60;
cout<<"Total seconds: "<<total_seconds<<"\n";
return 0;
}