我正在使用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();
答案 0 :(得分:1)
这意味着startDate
和endDate
之间的差异超过了年份,因此无法计算normalized standard
。
如果期限包含年份或月份,那么月份将是 标准化为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