使用Period with PeriodType.forFields时出现异常

时间:2013-10-17 18:51:13

标签: java jodatime

我正在使用joda-time在两个日期之间获取一些时间/日期组件。 (http://joda-time.sourceforge.net

当我将PeriodTypes用作standard()day()时,一切正常。 但是当我使用PeriodType.forFields(...)时,我得到一个例外:

所以,这有效:

Period p = new Period(new DateTime(startDate.getTime()), new DateTime(endDate.getTime()), PeriodType.days()).normalizedStandard(PeriodType.days());
return p.getDays();

这引发了一个例外:

Period p = new Period(new DateTime(startDate.getTime()), new DateTime(endDate.getTime()), PeriodType.forFields(new DurationFieldType[]{DurationFieldType.months(), DurationFieldType.weeks()})).normalizedStandard(PeriodType.forFields(new DurationFieldType[]{DurationFieldType.months(), DurationFieldType.weeks()}));
return p.getMonths();

任何想法我做错了什么? 任何帮助都非常感谢。

例外:

  
    

10-17 14:35:50.999:E / AndroidRuntime(1350):     java.lang.UnsupportedOperationException:不支持字段10-17     14:35:50.999:E / AndroidRuntime(1350):at     org.joda.time.PeriodType.setIndexedField(PeriodType.java:690)10-17     14:35:50.999:E / AndroidRuntime(1350):at     org.joda.time.Period.withYears(Period.java:896)10-17 14:35:50.999:E / AndroidRuntime(1350):at     org.joda.time.Period.normalizedStandard(Period.java:1630)

  

编辑:

我很确定这是一个错误。我测试了一些更多的组合,并且非标准PeriodTypes似乎存在问题而没有多年。 例如:

这有效:

Period p = new Period(new DateTime(startDate.getTime()), new DateTime(endDate.getTime()), PeriodType.standard()).normalizedStandard(PeriodType.standard());
return p.getMonths();

如果我使用 withYearsRemoved() 删除年份PeriodType,我会收到例外情况:

Period p = new Period(new DateTime(startDate.getTime()), new DateTime(endDate.getTime()), PeriodType.standard().withYearsRemoved()).normalizedStandard(PeriodType.standard().withYearsRemoved());
return p.getMonths();

1 个答案:

答案 0 :(得分:1)

这意味着startDateendDate之间的差异超过了年份,因此无法计算normalized standard

来自Period::normalizedStandard

  

如果期限包含年份或月份,那么月份将是   标准化为0到11之间。字段和以下字段将是   必要时归一化,但这不会溢出   月场。因此,1年15个月的期限将标准化为2   3个月。但是1个月40天的时间仍然是1个月   40天。

因此,如果差异超过1年,则不能使用normalizedStandard withYearsRemoved

示例:

  DateTime startDate = new DateTime().minusYears(10);
  DateTime endDate = new DateTime();
  Period p = new Period(startDate, endDate, PeriodType.standard().withYearsRemoved())
     .normalizedStandard(PeriodType.standard().withYearsRemoved());
  p.getMonths(); // throw exception, difference is 10 years!  

  DateTime startDate = new DateTime().minusMonths(10);
  DateTime endDate = new DateTime();
  Period p = new Period(startDate, endDate, PeriodType.standard().withYearsRemoved())
     .normalizedStandard(PeriodType.standard().withYearsRemoved());
  p.getMonths(); // return 10, difference is less then 1 year  

  DateTime startDate = new DateTime().minusYears(10);
  DateTime endDate = new DateTime();
  Period p = new Period(startDate, endDate, PeriodType.standard().withYearsRemoved());
  p.getMonths(); // return 120, standart isn't normalized