当前位置: 代码迷 >> J2SE >> JAVA中怎么得到两个日期相减的月数?
  详细解决方案

JAVA中怎么得到两个日期相减的月数?

热度:19   发布时间:2016-04-24 00:27:42.0
JAVA中如何得到两个日期相减的月数???急!!
JAVA中如何得到两个日期相减的月数???
我用如下函数得到的月数有问题:
public int getMonthNum(Date date1,Date date2) {
Calendar cal1=Calendar.getInstance();
cal1.setTime(date1);
Calendar cal2=Calendar.getInstance();
cal2.setTime(date2);
return (cal2.get(1)-cal1.get(1))*12+(cal2.get(2)-cal1.get(2));
}
例如用2012-7-30减去2012-8-2 得到的月数为1;
用2012-7-31进去2012-7-1得到的月数为0


该怎么写才能精确的计算两个日期相减的月数呢???????????


------解决方案--------------------
你这样的要求不是很简单吗?
Java code
int m = date1.getMonth()-date1.getMonth();
------解决方案--------------------
再加上年
Java code
int m = (date1.getYear()-date2.getYear())*12+date1.getMonth()-date1.getMonth();
------解决方案--------------------
不明白你这个精确的意思!!!!给个例子?
------解决方案--------------------
加上年
------解决方案--------------------
Java code
import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;public class MonthTest{    public static void main(String[] args) throws ParseException {        String d1 = "2012-01-12";        String d2 = "2010-02-11";        SimpleDateFormat sdf  = new SimpleDateFormat("yyyy-MM-dd");        Calendar c = Calendar.getInstance();        c.setTime(sdf.parse(d1));        int year1 = c.get(Calendar.YEAR);        int month1 = c.get(Calendar.MONTH);                c.setTime(sdf.parse(d2));        int year2 = c.get(Calendar.YEAR);        int month2 = c.get(Calendar.MONTH);                int result;        if(year1 == year2) {            result = month1 - month2;        } else {            result = 12*(year1 - year2) + month1 - month2;        }        System.out.println(result);    }}
------解决方案--------------------
顶,楼上回答正确
------解决方案--------------------
探讨

Java code
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class MonthTest{

public static void main(String[] args) throws ParseException {
……

------解决方案--------------------
楼主我懂你!!!分给我吧
把两个日期都化成秒,然后再相减~~~
JAVA中以某个时刻为0秒,具体可以去查API!
其实日期就是以秒储存的,显示时再转化过来。
代码蛮简单呀~马上吃饭了~要不等会贴代码?
------解决方案--------------------
Java code
public int getMonthNum(Date date1,Date date2) {Calendar cal1=Calendar.getInstance();cal1.setTime(date1);Calendar cal2=Calendar.getInstance();cal2.setTime(date2);long millis1=cal1.getTimeInMillis();long millis2=cal2.getTimeInMillis();long millis;(millis1>millis2)?(millis=millis1-millis2):(millis=millis2-millis1);//java能这么写吗?忘记了!反正是判断谁大谁小,不能这样写就自己改下吧~~Calendar cal=Calendar.getInstance();cal.setTimeInMillis(millis);return (cal.get(1)*12+cal.get(2));}
------解决方案--------------------
上面12月是11打漏了。。。
------解决方案--------------------
keithcai兄弟讲的没太明白
我也来个比较笨的方法,年月日都可以算

Java code
import java.text.SimpleDateFormat;import java.util.Calendar;public class Test {    public static void main(String[] args) throws Exception {        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");        long time1 = sdf.parse("2012-01-12").getTime();        long time2 = sdf.parse("2010-02-11").getTime();        System.out.println(getFieldDifference(time1, time2, Calendar.YEAR));        System.out.println(getFieldDifference(time1, time2, Calendar.MONTH));        System.out.println(getFieldDifference(time1, time2, Calendar.DATE));    }    /**     * 区分两个日期之间指定字段的差值     *      * @param time1     *            开始时间     * @param time2     *            结束时间     * @param field     *            要比较的字段(年,月,日,...)     * @return 如果time1>time2就反回一个正的差值,如果time1<time2则返回一个负的差值,如果相等,返回0     */    public static int getFieldDifference(long time1, long time2, int field) {        if (time1 == time2) {            return 0;        } else if (time1 > time2) {            return -getFieldDifference(time2, time1, field);        }        Calendar cal1 = Calendar.getInstance();        cal1.setLenient(false);        cal1.setTimeInMillis(time1);        Calendar cal2 = Calendar.getInstance();        cal2.setLenient(false);        cal2.setTimeInMillis(time2);        for (int x = 0; x < Calendar.FIELD_COUNT; x++) {            if (x > field) {                cal1.clear(x);                cal2.clear(x);            }        }        time1 = cal1.getTimeInMillis();        time2 = cal2.getTimeInMillis();        long ms = 0;        int min = 0, max = 1;        while (true) {            cal1.setTimeInMillis(time1);            cal1.add(field, max);            ms = cal1.getTimeInMillis();            if (ms == time2) {                min = max;                break;            } else if (ms > time2) {                break;            } else {                max <<= 1;            }        }        while (max > min) {            cal1.setTimeInMillis(time1);            int t = (min + max) >>> 1;            cal1.add(field, t);            ms = cal1.getTimeInMillis();            if (ms == time2) {                min = t;                break;            } else if (ms > time2) {                max = t;            } else {                min = t;            }        }        return -min;    }}
  相关解决方案