我想根据用户选择的持续时间添加月数。
我编写了以下代码,它是根据用户选择的持续时间获取当前日期并添加月份,但我希望它采用从前端传递的开始日期,并根据持续时间添加月份。
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() ));
}
答案 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)
旧类(Date
,Calendar
和SimpleDateFormat
)有lots of problems和design 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);
}
}
}