有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:自定义将1个月添加到当前日期

我读过很多书,基本上我已经知道Calendar对象可以在指定的日期上加1个月,比如:

Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1);

尽管我不喜欢它在30号或31号的时候的行为。如果我在2012年1月31日之前加上1个月,输出将变为2012年2月29日。当我再加上一个月,它就变成了2012年3月29日

我是否可以强制2012年2月29日自动变为2012年3月1日

基本上这就是我想要发生的事情:

默认日期:2012年1月31日

添加1个月:2012年1月3日

新增1个月:2012年3月31日


共 (3) 个答案

  1. # 1 楼答案

    你想要的是一些隐含的知识,如果开始日期是一个月的最后一天,加上一个月,结果应该是下个月的最后一天。也就是说,房产“月的最后一天”应该是粘性的

    这在Java的Calendar中不直接可用,但一种可能的解决方案是使用Calendar.getActualMaximum(Calendar.DAY_OF_MONTH)重置月递增后的第二天

    Calendar cal = ...;
    cal.add(Calendar.MONTH,1);
    cal.set(Calendar.DAY_OF_MONTH,cal.getActualMaximum(Calendar.DAY_OF_MONTH));
    

    您甚至可以将GregorianCalendar子类化并添加一个方法

    public Calendar endOfNextMonth() { ... }
    

    来封装操作

  2. # 2 楼答案

    加上30天,你可以这样做:

    public static java.sql.Date sumarFechasDias(java.sql.Date fch, int days) {
        Calendar cal = new GregorianCalendar();
        cal.setTimeInMillis(fch.getTime());
        cal.add(Calendar.DATE, days);
        return new java.sql.Date(cal.getTimeInMillis());
    }
    

    如果days=30,它将返回添加了30天的日期

  3. # 3 楼答案

    如果下个月的日期小于前一个月的日期,则看起来您希望日历滚动到下个月初。下面是我们如何做到这一点:

    Calendar cal = Calendar.getInstance();
    int oldDay = cal.get(DAY_OF_MONTH);
    cal.add(Calendar.MONTH, 1);
    
    // If the old DAY_OF_MONTH was larger than our new one, then
    // roll over to the beginning of the next month.
    if(oldDay > cal.get(DAY_OF_MONTH){
      cal.add(Calendar.MONTH, 1);
      cal.set(Calendar.DAY, 1);
    }