用JodaTime添加月份?

时间:2014-08-14 04:31:45

标签: java date jodatime

我正在尝试用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;
    }

如何解决这个问题?

3 个答案:

答案 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

Documentation

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);