java,商品保质期计算总是不准确

public void getExpiredDate2(ValueChangeEvent event) {
if(event.getNewValue() != null && editModel.getShelfLife()>0){
Date firstOutDate=(Date)event.getNewValue();
Calendar d = Calendar.getInstance();// 获得一个日历的实例
d.setTime(firstOutDate);//date转换calender
d.add(d.get(Calendar.MONTH) + 1, editModel.getShelfLife());// following the 0-based rule月是从零开始算的
editModel.setExpiredDate(d.getTime()) ;
}
}
这个是我的源代码,月不是在calendar里面直接相加?为什么得到的数值就是不准确,ShelfLife保质期,是int型的月份,firstOutDate为出厂日期,出厂日期直接加上保质期,可结果是错的,比如2017-5-1,输个2月,得到2017-5-15,why?哪位大神告诉我为什么?以及更好的处理代码,小弟拜谢啦!

写了一个完整的测试程序JudgeExpired.java,代码如下:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class JudgeExpired {

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

        int month = 28;//保质期28个月
        String productionDateString = "2012-3-18";
        executeJudge(month,productionDateString);

    }

    public static void executeJudge(int month,String productionDateString) throws ParseException
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date productionDate = sdf.parse(productionDateString); //生产日期

        Calendar c = Calendar.getInstance();
        c.setTime(productionDate);

        int yearAdd = month /12 ; //计算整的保质年份
        int monthAdd = month % 12 ; //以及月份

        c.add(Calendar.YEAR, yearAdd);
        c.add(Calendar.MONTH, monthAdd);

        Date ExpiredDate = c.getTime();

        System.out.println("商品生产时间为:"+ sdf.format(productionDate));
        System.out.println("商品保质期为:"+ month + "个月" );
        System.out.println("商品过期时间为:"+ sdf.format(ExpiredDate));
        Date currentDate = sdf.parse(sdf.format(new Date()));  //当前日期

        if (currentDate.after(ExpiredDate)){
            System.out.println("截止到今天商品已经过期!");
        }
        else{
            System.out.println("商品还在保质期!");
        }      
    }
}

测试结果如下图:

图片说明

代码不算太复杂,没有写过多的注释。
关于日期的一些计算和处理,这个范例里基本涉及到了。你可以对照题目的情况摘取使用。

附: 这个问题你几天之前好象问过? 当时想回答,可你已经采纳别的答案了。希望这次还来得及

用心回答每个问题,如果对您有帮助,请采纳答案好吗,谢谢。

            //没有set 默认用今天做测试
            Calendar d = Calendar.getInstance();// 今天 2017-05-25
            d.add(Calendar.MONTH, 2);//月份加+2
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            System.err.println(sdf.format(d.getTime()));

答案:2017-07-25

d.add(Calendar.MONTH, editModel.getShelfLife());

package com.enuedu.zqh00;

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

public class Demo {
private static Date date;
private static Date date1;

public static void main(String[] args) {
    System.out.println("请输入第一个日期:");
    String a=new Scanner(System.in).nextLine();
    System.out.println("请输入第二个日期:");
    String b=new Scanner(System.in).nextLine();
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
    Date date = null;
    Date date1=null;
    try {
         date = sdf.parse(a);
    } catch (ParseException e) {

        e.printStackTrace();
    }
    try {
        date1 = sdf.parse(b);
    } catch (ParseException e) {

        e.printStackTrace();
    }
    long day=(date.getTime()-date1.getTime())/(24*60*60*1000);
    System.out.println(day);

}

}