我正在尝试用JodaTime添加月份。我有几个月的付款计划,例如:一个月,两个月,三个月和六个月。
当我在DateTime添加六个月时,没有工作并返回异常。
我正在尝试这个。
/** cria data vencimento matricula */
public void getDataVencimento(Integer dia, Integer planoPagamento){
//monta data para JodaTime
DateTime data = new DateTime();
Integer ano = data.getYear();
Integer mes = data.getMonthOfYear() + 6; //here 6 month
//monta a data usando JodaTime
DateTime dt = new DateTime(ano, mes, dia, 0, 0);
//convert o datetime para date
Date dtVencimento = dt.toDate();
System.out.println(df.format(dtVencimento));
//retorna a proxima data vencimento
// return dtVencimento;
}
/** exception */
Exception in thread "AWT-EventQueue-0" org.joda.time.IllegalFieldValueException: Value 14 for monthOfYear must be in the range [1,12]
/** I did this and now works */
/** cria data vencimento */
public Date getDataVencimento(Integer dia, Integer planoPagamento){
//monta data para JodaTime
DateTime data = DateTime.now();//pega data de hoje
DateTime d = data.plusMonths(planoPagamento);//adiciona plano de pagamento
//cria data de vencimento
DateTime vencimento = new DateTime(d.getYear(), d.getMonthOfYear(), dia, 0, 0);
//convert o datetime para date
Date dtVencimento = vencimento.toDate();
//retorna a proxima data vencimento
return dtVencimento;
}
如何解决这个问题?
答案 0 :(得分:15)
问题是,您将一个月值传递给DateTime
构造函数,该构造函数不在范围内。如果构造函数溢出到下一个更高的字段,则它不会滚动值。如果任何字段超出范围,则会抛出异常,此处的月份为14
,肯定超出范围[1, 12]
。
您可以简单地使用plusMonths()
类中的DateTime
方法添加月份,而不是使用当前的方法:
DateTime now = DateTime.now();
DateTime sixMonthsLater = now.plusMonths(6);
如果月份值溢出,这将自动滚动月份值。
答案 1 :(得分:6)
data.getMonthOfYear()
将返回当前月份August
表示 8 ,但您添加 6 表示mes
变为<强> 14 ,这不是有效MonthOfYear
因此导致IllegalFieldValueException: Value 14
。
您可以使用DateTime
类
<强>样品:强>
DateTime dt = new DateTime(); //will initialized to the current time
dt = dt.plusMonths(6); //add six month prior to the current date
plusMonths(int months)
Returns a copy of this datetime plus the specified number of months.
答案 2 :(得分:3)
最简单的方法就是这样,使用plus
方法向DateTime
对象添加6个月的时间段:
import org.joda.time.DateTime;
import org.joda.time.Months;
// ...
DateTime now = new DateTime();
DateTime sixMonthsLater = now.plus(Months.SIX);