AAAAA689 2017-05-25 07:59 采纳率: 0%
浏览 1707
已采纳

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?哪位大神告诉我为什么?以及更好的处理代码,小弟拜谢啦!

  • 写回答

4条回答 默认 最新

  • 战在春秋 2017-05-25 09:14
    关注

    写了一个完整的测试程序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("商品还在保质期!");
            }      
        }
    }
    

    测试结果如下图:

    图片说明

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

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 关于#Mybatis#的问题:怎么办重复数据如下"KSDM":37,"KSMC":"呼吸内科门诊","ksdm":37,"ksmc":"呼吸内科门诊"xml文件填写
  • ¥40 servlet的web程序部署出错
  • ¥50 activiti 新建流程系列问题
  • ¥50 为什么我版本升级之后运行速度变慢5倍??
  • ¥15 如何在gazebo中加载机械臂和机械手
  • ¥15 纯运放实现隔离采样方案设计
  • ¥20 easyconnect无法连接后缀带.com的网站,一直显示找不到服务器ip地址,但是带有数字的网站又是可以连接上的,如何解决
  • ¥15 电脑开机过商标后就直接这样,求解各位
  • ¥15 mysql , 用自己创建的本地主机和用户名 登录不上
  • ¥15 关于#web项目#的问题,请各位专家解答!