2011-02-05开始签租房合同,时间是一个月,那么合同到期时间是2011-03-04、
算法是:自然月加一(成3月了),天数减一(成4号了)
再来看另外一个日期:2011-02-28开始,为期一个月,那么,按照上面的算法,结束日期是2011-03-27
这个时候问题来了,有人说结束日期应该是2011-03-30、
我想我猜测我估计我觉得我认为他是这么想的:2011-02-28是2月的最后一天,那么加一个月之后应该是下一个月的最后一天,即:2011-03-31,31-1=30.
我个人的观点是不管是月头还是月末还是月中,都按照自然月加一天书减一的算法。当然这只是我个人的观点,另外我贴上一段代码就当是证据吧、public static void main(String[] args) {
String date = "2011-02-28";
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
Date d = sdf.parse(date);
cal.setTime(d);
System.out.println("合同开始日期:" + sdf.format(cal.getTime()));
cal.add(Calendar.MONTH, 1);
cal.add(Calendar.DAY_OF_MONTH, -1);
System.out.println("合同结束日期:" + sdf.format(cal.getTime()));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}最后输出:合同开始日期:2011-02-28
合同结束日期:2011-03-27求板砖、

解决方案 »

  1.   

    对于四楼的朋友说的数据库会自动设置正确的时间这一说法提一些意见,当用户选择了合同开始日期和合同期限之后,要立刻把结束日期计算出来并返回给用户,如果按您的说法那我还得先存一下数据库然后在查数据库最后在返回给用户,很显然这样太麻烦了。但是我还是对你说的那个方法感兴趣,如果方便的话请贴出SQL语句,如果不行的话我一会去百度查查。
    还有一点我想说的是:我把上面贴出来的代码中开始日期改为String date = "2011-01-31";
    然后把减去一天的那行代码注释掉...
    String date = "2011-01-31";
    ...
    //(cal.ad(Calendar.DAY_OF_MONTH, -1);)
    ...注释掉,输出的值是:合同开始日期:2011-01-31
    合同结束日期:2011-02-28也就是说java里边没有给计算到2月31号(也就是楼上说的3月2号)去、而是28号。
    不知道这作何解释
      

  2.   

    那可能add的时候内部作了调整了,如果是单纯的set,会导致日期变化的
    for example
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.DAY_OF_MONTH, 30); //30日
    cal.set(Calendar.MONTH, 1); //2月
    System.out.println("date:" + sdf.format(cal.getTime()));