2 qq 34108945 qq_34108945 于 2016.04.10 12:05 提问

两个日期之间的天数计算,计算结果会有误差,请问我有什么地方考虑不周到?

/**

  • 计算两个日期之间的天数
    • 比如2016年4月10日到1991年2月2日是正确的,2016年4月10日到2134年5月15日
    • 就差了两天 */ import java.util.Scanner;

public class Test03 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入两个日期");
int year1 = scanner.nextInt();
int month1 = scanner.nextInt();
int day1 = scanner.nextInt();
int year2 = scanner.nextInt();
int month2 = scanner.nextInt();
int day2 = scanner.nextInt();
System.out.println("两个日期相差"+ Math.abs(switch1(year1, month1, day1)
- switch1(year2, month2, day2)) + "天");
}
/**
* 该方法用于做闰年判断
* 是闰年返回true,不是闰年则返回false
* return boolean;
* @param year
* @return
/
public static boolean isLeapYear(int year) {
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
return true;
}
return false;
}
/
*
* 该方法用于获取某年在某个月的天数
* @param year
* @param month
* @return
*/
public static int daysOfMonth(int year, int month) {
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 2:
if (isLeapYear(year)) {
return 29;
} else {
return 28;
}
case 4:
case 6:
case 9:
case 11:
return 30;
default:
throw new RuntimeException("月份输入有误");
}

}
/**
 * 该方法用来将一个日期转化为距公元0年的天数;
 * 负数为公元前的,正数为公元后;
 * @param year
 * @param month
 * @param day
 * @return
 */
public static int switch1(int year, int month, int day) {
    int y = 0;//给定年份到公元0年的天数
    int temp = 0;//中间变量,用来获取当前年份的天数的;
    /*
     * 
     * 1.如果year=0,只需计算当前月到元月的天数(不含本月)m+day
     * 2.若year>0,计算当前年份到公元0年的天数(不含本年)y+m+day
     * 3.若year<0;此时y我负值y+m+day;
     */
    while(!(year==0)){
        if(year>0){
            temp=isLeapYear(year-1)?366:365;
            year--;
        }else{
            temp=-(isLeapYear(year)?366:365);
            year++;
        }
        y+=temp;
    }
    int m = 0;//当前月在这一年中的已过的天数,不包含本月
    for (; month > 1; month--) {
        m += daysOfMonth(year, month - 1);
    }
    return (y + m + day);//年月日相加获得天数
}

}

5个回答

qq_34108945
qq_34108945   2016.04.10 15:06
已采纳

y=((isLeapYear(--year))?365*year+(year/4-year/100+year/400):0);是这么写吗?

qq_34108945
qq_34108945 回复智者知已应修善业: 虽然看不懂 不过能把日历都给做出来肯定很厉害了,谢谢
一年多之前 回复
xianfajushi
xianfajushi 回复ActualMental: 没JAVA编辑器,有C++的http://blog.csdn.net/xianfajushi/article/details/44811153
一年多之前 回复
xianfajushi
xianfajushi 回复ActualMental: 是的,因为闰年的计算在跟着的括号内处理了。
一年多之前 回复
qq_34108945
qq_34108945 回复智者知已应修善业: 你能给个代码就最好了
一年多之前 回复
qq_34108945
qq_34108945 回复智者知已应修善业: 你的意思是直接用365*(year-1)吗?如y=(--year)*365;
一年多之前 回复
qq_34108945
qq_34108945 回复智者知已应修善业: 你的意思是直接用365*(year-1)吗?如y=(--year)*365;
一年多之前 回复
xianfajushi
xianfajushi 因为闰年就在公式中计算了
一年多之前 回复
xianfajushi
xianfajushi 比如说要计算2016年1月1日有多少天,那么就是2016-1=2015*365...
一年多之前 回复
xianfajushi
xianfajushi 回复智者知已应修善业: 只是年值的判断,不需闰年判断
一年多之前 回复
xianfajushi
xianfajushi 不是
一年多之前 回复
CSDNXIAOD
CSDNXIAOD   2016.04.10 12:12

计算两个日期之间的工作天数
计算两个日期之间的工作天数
计算两个日期之间的天数
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

xianfajushi
xianfajushi   2016.04.10 12:44

年可以直接计算((--年) ? 365 * 年 + (年 / 4 - 年 / 100 + 年 / 400) : 0);然后+月+日

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.04.10 16:26

首先,看了下代码逻辑没有问题啊,我测试了计算结果是正确的。不知道你用的是什么测试数据呢?
其次,求日期间隔的天数的话,可以直接用两个日期的毫秒数相减后除以每天的毫秒数来计算的。
更简单的实现方法如下:

 import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class DaySpan {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入开始日期(例如20140101):");
        String start = scanner.next();
        System.out.println("请输入结束日期(例如20150101):");
        String end = scanner.next();
        Date startDate = formatDate(start);
        Date endDate = formatDate(end);
        scanner.close();
        if(startDate==null){
            System.out.println("开始日期格式不正确。");
            return;
        }

        if(endDate==null){
            System.out.println("结束日期格式不正确。");
            return;
        }

        int daySpan = daySpan(startDate,endDate);
        System.out.println(start+"与"+end+"之间相差"+daySpan+"天。");
        scanner.close();
    }


    public static int daySpan(Date from,Date to){
        int daySpan = 0;
        long start = from.getTime();
        long end = to.getTime();
        long dayUnit = (long)24*60*60*1000;
        long abs = Math.abs(start-end);
        daySpan = (int)(abs/dayUnit);
        return daySpan;
    }

    public static Date formatDate(String str){
        Date t = null;
        DateFormat format = new SimpleDateFormat("yyyyMMdd");
        try {
            t = format.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return t;
    }
}

qq_34108945
qq_34108945 非常感谢,调用javaAPI的方法我也会一种,用SipmpleDateFormat将字符串的日期格式解析成Date型,获得两个Date的Long值做算数运算即可;虽然没你的全面却能做出来了
一年多之前 回复
qq_34108945
qq_34108945 非常感谢,调用javaAPI的方法我也会一种,用SipmpleDateFormat将字符串的日期格式解析成Date型,获得两个Date的Long值做算数运算即可;虽然没你的全面却能做出来了
一年多之前 回复
qq_34108945
qq_34108945   2016.04.12 00:26

抱歉,新手手残点到采纳自己了。。。。智者知已应修善业 ,毕小宝的答案都不错,感谢两位!!!!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!