问题
学者A去国外求学,假定离开祖国的日子为公园A年B月C日,返回的日子为公元X年Y月Z日。请计算A出国留学的总天数(含离开和返回当天)。
分析
思路1
工具类
思路2
出走当年天数计算
返回当年天数计算
中间间隔天数计算
返回和出走是同一年计算
思路3
出走和离开时间距离0年0月0日的天数之差
Java实现
思路1
public static long day2(int A,int B,int C,int X,int Y,int Z){
return LocalDate.of(X,Y,Z).toEpochDay()-LocalDate.of(A,B,C).toEpochDay()+1;
}
思路2
public static int day(int A,int B,int C,int X,int Y,int Z) {
int days = 0;
//出走和回来的间隔年
for (int i = A+1; i < X; i++) {
if ((i % 4 == 0 && i % 100 != 0)||i % 400 == 0) {
days += 366;
}else {
days += 365;
}
}
//出走和离开是同一年
if(X == A) {
//离开和出走是同一月
if (B == Y){
days += Z-C+1;
}else {
for (int i = B+1; i < Y; i++) {
days += dateUtil(i);
}
//离开月的天数
days += dateUtil(B) + 1;
days += Y;
}
//离开和出走不是同一年
}else {
//出走月
for (int i = B+1; i <=12 ; i++) {
days += dateUtil(i);
}
//出走的当月天数
days += dateUtil(B) - C + 1;
//闰年
if ((A % 4 == 0 && A % 100 != 0)||A % 400 == 0) {
if (B < 3) days += 1;
}
//返回月计算
for (int i = 1; i < Y ; i++) {
days += dateUtil(i);
}
//返回当天计算
days += Z;
//回来的闰年
if ((X % 4 == 0 && X % 100 != 0)||X % 400 == 0) {
if (Y > 3) days += 1;
}
}
return days;
}
public static int dateUtil(int month){
int days = 0;
switch (month){
case 1: days += 31;break;
case 2: days += 28;break;
case 3: days += 31;break;
case 4: days += 30;break;
case 5: days += 31;break;
case 6: days += 30;break;
case 7: days += 31;break;
case 8: days += 31;break;
case 9: days += 30;break;
case 10: days += 31;break;
case 11: days += 30;break;
case 12: days += 31;break;
}
return days;
}
思路3
public static int dateUtil(int month){
int days = 0;
switch (month){
case 1: days += 31;break;
case 2: days += 28;break;
case 3: days += 31;break;
case 4: days += 30;break;
case 5: days += 31;break;
case 6: days += 30;break;
case 7: days += 31;break;
case 8: days += 31;break;
case 9: days += 30;break;
case 10: days += 31;break;
case 11: days += 30;break;
case 12: days += 31;break;
}
return days;
}
public static long day(int A,int B,int C){
long days = 0;
for (int i = 0; i < A; i++) {
if ((i % 4 == 0 && i % 100 != 0)||i % 400 == 0) {
days += 366;
}else {
days += 365;
}
}
for (int i = 1; i < B; i++) {
days += dateUtil(i);
if ((A % 4 == 0 && A % 100 != 0)||A % 400 == 0) {
if (i == 2) days += 1;
}
}
days += C;
return days;
}
public static long day3(int A,int B,int C,int X,int Y,int Z){
return day(X,Y,Z)-day(A, B, C)+1;
}