计算两个时间内的天数的java程序 出错误了,请大神帮我看看哪里错了,是算法问题么....
public class 间隔日期 {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int zong=0;/*总日子*/
int runnian=0;/*闰年数*/
int genian=0;/*间隔年数---最后用来记录平年数*/
int cri=0;/*起点月需要扣除的日子*/
int zri=0;/*终点月需要扣除的日子*/
System.out.println("请输入起始年份:");
int nian1=in.nextInt();
System.out.println("请输入起始月份:");
int yue1=in.nextInt();
System.out.println("请输入起始日期:");
int ri1=in.nextInt();
System.out.println("起始时间为:"+nian1+"年"+yue1+"月"+ri1+"日");
System.out.println("请输入终点年份:");
int nian2=in.nextInt();
System.out.println("请输入终点月份:");
int yue2=in.nextInt();
System.out.println("请输入终点日期:");
int ri2=in.nextInt();
System.out.println("终点时间为:"+nian2+"年"+yue2+"月"+ri2+"日");
for(int i=nian1;i<=nian2;i++){
if((((i%4)==0)&&((i%100)!=0))||((i%400)==0)){
runnian++;
}else{
genian++;
}
}/*runnian 为 闰年日子 genian 为平年日子*/
System.out.println("期间平年有:"+genian+"年"+"\t"+"期间闰年有:"+runnian+("年"));
for(int i=yue1;i!=0;i--){
if(i==2){
if((((nian1%4)==0)&&((nian1%100)!=0))||((nian1%400)==0)){
cri=cri+29;
}else{
cri=cri+28;
}
}else{
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12){
cri=cri+31;
}else{
cri=cri+30;
}
}
}
for(int i=yue2;i!=0;i--){
if(i==2){
if((((nian1%4)==0)&&((nian1%100)!=0))||((nian1%400)==0)){
zri=zri+29;
}else{
zri=zri+28;
}
}else{
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12){
zri=zri+31;
}else{
zri=zri+30;
}
}
}
if((((nian2%4)==0)&&((nian2%100)!=0))||((nian2%400)==0)){
zri=366-zri;
}else{
zri=365-zri;
}
zong=(genian*365)+(runnian*366)+ri1+ri2;
zong=zong-cri-zri;
System.out.println("期间一共有:"+zong+"天。");
}
} 展开
假设上图中C点为你所输入的年月日(不妨假设为2013-4-4),那么A就是该年的第一天,即2013-1-1,B为你输入那个月份的第一天,即2013-4-1,D为你输入的那个月份的最后一天,即2013-4-30,E为你输入那年的最后一天,即2013-12-31.
同样H为你输入第二个日期,其余点类似。
现在要求出CH的值。(假设后输入日期在前输入的日期之后)
你现在的算法是这样的。
1) zong = (genian * 365) + (runnian * 366) + ri1 + ri2;
即:zong = AJ +BC + GH.
(genian * 365) + (runnian * 366) = AJ; ri1=BC; ri2=GH.
2) zong = zong - cri - zri;
cri=AB; zri=IJ
那么最后的结果为:AJ+BC+GH-AB-IJ这是不对的。
应该这样来算:CH = AJ-AB-BC-HJ
其中AJ=(genian * 365) + (runnian * 366)
AB=cri; BC=ri1; HJ=(HI+IJ)
IJ=zri; HI= 第二个日期所在月的天数(28/29/30/31)-ri2.
import java.util.Calendar;
public class $ {
public static void main(String[] args) {
Calendar from = Calendar.getInstance();
from.set(2013, Calendar.JANUARY, 1);// 2013-01-01
Calendar to = Calendar.getInstance();
to.set(2013, Calendar.FEBRUARY, 1);// 2013-02-01
System.out.println(to.get(Calendar.DAY_OF_YEAR) - from.get(Calendar.DAY_OF_YEAR));
}
}
API里的方法,多简单,这个小算法,适合在学C的时候练手用,java的精髓不在这里。
2013-09-24
但计算呢,就不知道是不是正确了。参考这个结果
假如
int nian1=1999, yue1=10, ri1=10;
int nian2=2004, yue2=10, ri2=10;
你的计算结果是
期间一共有:1846天。
java.util.Date d1=new java.sql.Date(nian1, yue1, ri1);
java.util.Date d2=new java.sql.Date(nian2, yue2, ri2);
long dif = d2.getTime()-d1.getTime();
System.out.println("期间一共有:"+(dif/1000/60/60/24)+"天。");
这方法的计算结果是
期间一共有:1826天。
Calendar beginTime = new GregorianCalendar(year, month, day);
nowTime = new GregorianCalendar(); //当前时间
int millisecondOfDay = 24*60*60*1000;
long dayNum = (nowTime.getTimeInMillis()-beginTime.getTimeInMillis())/millisecondOfDay;
并不是代码错误,只是计算的时候会出现多一天的情况。