将日期添加到日期

时间:2017-09-11 08:34:44

标签: java date calendar date-formatting date-parsing

我想根据用户选择的持续时间添加月数。

我编写了以下代码,它是根据用户选择的持续时间获取当前日期并添加月份,但我希望它采用从前端传递的开始日期,并根据持续时间添加月份。

String le=ra.getLease_period(); //duration
String ls=ra.getLeasestart(); // start date

if (le.equals("1"))
{         
    final SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd" );
    final Date dur1 = df.parse( ls ); // conversion from String
    System.out.println("Start date passed is:" + dur1);
    String m = df.format(dur1);
    System.out.println("Formatted dur1 is" + m);
    final java.util.Calendar cal1 = GregorianCalendar.getInstance();
    cal1.setTime( date );
    cal1.add(GregorianCalendar.MONTH, 1 ); // date manipulation
    System.out.println( "result: " + df.format( cal1.getTime() ) ); 
    ra.setLeaseend(df.format( cal1.getTime() ));       
}

4 个答案:

答案 0 :(得分:1)

持续时间不应该是日期。我会说它应该是一个int(月数)。

final Integer dur1 = Integer.parseInt( le ); // conversion from String
final java.util.Calendar cal1 = GregorianCalendar.getInstance();
cal1.setTime( date );
cal1.add(GregorianCalendar.MONTH, dur1 ); // date manipulation

答案 1 :(得分:1)

感谢大家的帮助..我通过在cal1.setTime()函数中传递开始日期解决了这个问题。

Calendar cal1 = new GregorianCalendar();
cal1.setTime(ra.getLeasestart());
cal1.add(Calendar.MONTH, +1);
Date today1=cal1.getTime();

if(le.equals("1")){

            System.out.println("Lease end date if duratio is 1:"+today1);
            ra.setLeaseend(today1);
        }
// and so one

答案 2 :(得分:1)

旧类(DateCalendarSimpleDateFormat)有lots of problemsdesign issues,它们将被新API取代。< / p>

如果您使用的是 Java 8 ,请考虑使用new java.time API。它更容易,less bugged and less error-prone than the old APIs

如果您使用的是 Java&lt; = 7 ,则可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。对于 Android ,您还需要ThreeTenABP(更多关于如何使用它here)。

以下代码适用于两者。 唯一的区别是包名称(在Java 8中为java.time,在ThreeTen Backport(或Android的ThreeTenABP)中为org.threeten.bp),但类和方法名称是相同的

首先,您可以将输入String解析为LocalDate(使用DateTimeFormatter),然后使用方法plusMonths添加指定的月数。最后,使用相同的格式化程序格式化结果日期:

// assuming "le" and "ls" are as described in the question
if (le.equals("1")) {
    // parse the input to a LocalDate
    DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    LocalDate dt = LocalDate.parse(ls, fmt);
    // add 1 month
    LocalDate nextMonth = dt.plusMonths(Integer.parseInt(le));
    // print it
    System.out.println(fmt.format(nextMonth));
}

答案 3 :(得分:0)

@StanislavL已经回答了这个......所以我只是提供这个来展示一些简单的探索性测试包装:

package time;

import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import org.junit.Test;

public class TimeTest {

    @Test
    public void timeInputs1Month() throws ParseException {
        Inputs ra = spy(new Inputs("2017-09-11", "1"));
        stackOverflowQuestion(ra);
        verify(ra).setLeaseend(eq("2017-10-11"));
    }

    @Test
    public void timeInputs12Months() throws ParseException {
        Inputs ra = spy(new Inputs("2017-09-11", "12"));
        stackOverflowQuestion(ra);
        verify(ra).setLeaseend(eq("2018-09-11"));
    }

    private void stackOverflowQuestion(Inputs ra) throws ParseException {
        String le = ra.getLease_period(); //duration
        String ls = ra.getLeasestart(); // start date

        final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        final Date date = df.parse(ls); // conversion from String
        System.out.println("Start date passed is:" + date);
        final java.util.Calendar cal1 = GregorianCalendar.getInstance();
        cal1.setTime(date);
        cal1.add(GregorianCalendar.MONTH, Integer.parseInt(le)); // date manipulation
        ra.setLeaseend(df.format(cal1.getTime()));
    }

    private class Inputs {

        private final String leaseStart;
        private final String leasePeriod;

        Inputs(String leaseStart, String leasePeriod) {
            this.leaseStart = leaseStart;
            this.leasePeriod = leasePeriod;
        }

        String getLease_period() {
            return leasePeriod;
        }

        String getLeasestart() {
            return leaseStart;
        }

        void setLeaseend(String leaseEnd) {
            System.out.println("result: " + leaseEnd);
        }
    }
}

值得注意的是SimpleDateFormat class isn't thread-safe