1 16 package org.joda.time; 17 18 import org.joda.time.base.BaseSingleFieldPeriod; 19 import org.joda.time.field.FieldUtils; 20 import org.joda.time.format.ISOPeriodFormat; 21 import org.joda.time.format.PeriodFormatter; 22 23 40 public final class Years extends BaseSingleFieldPeriod { 41 42 43 public static final Years ZERO = new Years(0); 44 45 public static final Years ONE = new Years(1); 46 47 public static final Years TWO = new Years(2); 48 49 public static final Years THREE = new Years(3); 50 51 public static final Years MAX_VALUE = new Years(Integer.MAX_VALUE); 52 53 public static final Years MIN_VALUE = new Years(Integer.MIN_VALUE); 54 55 56 private static final PeriodFormatter PARSER = ISOPeriodFormat.standard().withParseType(PeriodType.years()); 57 58 private static final long serialVersionUID = 87525275727380868L; 59 60 69 public static Years years(int years) { 70 switch (years) { 71 case 0: 72 return ZERO; 73 case 1: 74 return ONE; 75 case 2: 76 return TWO; 77 case 3: 78 return THREE; 79 case Integer.MAX_VALUE: 80 return MAX_VALUE; 81 case Integer.MIN_VALUE: 82 return MIN_VALUE; 83 default: 84 return new Years(years); 85 } 86 } 87 88 99 public static Years yearsBetween(ReadableInstant start, ReadableInstant end) { 100 int amount = BaseSingleFieldPeriod.between(start, end, DurationFieldType.years()); 101 return Years.years(amount); 102 } 103 104 116 public static Years yearsBetween(ReadablePartial start, ReadablePartial end) { 117 if (start instanceof LocalDate && end instanceof LocalDate) { 118 Chronology chrono = DateTimeUtils.getChronology(start.getChronology()); 119 int years = chrono.years().getDifference( 120 ((LocalDate) end).getLocalMillis(), ((LocalDate) start).getLocalMillis()); 121 return Years.years(years); 122 } 123 int amount = BaseSingleFieldPeriod.between(start, end, ZERO); 124 return Years.years(amount); 125 } 126 127 136 public static Years yearsIn(ReadableInterval interval) { 137 if (interval == null) { 138 return Years.ZERO; 139 } 140 int amount = BaseSingleFieldPeriod.between(interval.getStart(), interval.getEnd(), DurationFieldType.years()); 141 return Years.years(amount); 142 } 143 144 155 public static Years parseYears(String periodStr) { 156 if (periodStr == null) { 157 return Years.ZERO; 158 } 159 Period p = PARSER.parsePeriod(periodStr); 160 return Years.years(p.getYears()); 161 } 162 163 171 private Years(int years) { 172 super(years); 173 } 174 175 180 private Object readResolve() { 181 return Years.years(getValue()); 182 } 183 184 190 public DurationFieldType getFieldType() { 191 return DurationFieldType.years(); 192 } 193 194 199 public PeriodType getPeriodType() { 200 return PeriodType.years(); 201 } 202 203 209 public int getYears() { 210 return getValue(); 211 } 212 213 223 public Years plus(int years) { 224 if (years == 0) { 225 return this; 226 } 227 return Years.years(FieldUtils.safeAdd(getValue(), years)); 228 } 229 230 239 public Years plus(Years years) { 240 if (years == null) { 241 return this; 242 } 243 return plus(years.getValue()); 244 } 245 246 256 public Years minus(int years) { 257 return plus(FieldUtils.safeNegate(years)); 258 } 259 260 269 public Years minus(Years years) { 270 if (years == null) { 271 return this; 272 } 273 return minus(years.getValue()); 274 } 275 276 286 public Years multipliedBy(int scalar) { 287 return Years.years(FieldUtils.safeMultiply(getValue(), scalar)); 288 } 289 290 300 public Years dividedBy(int divisor) { 301 if (divisor == 1) { 302 return this; 303 } 304 return Years.years(getValue() / divisor); 305 } 306 307 314 public Years negated() { 315 return Years.years(FieldUtils.safeNegate(getValue())); 316 } 317 318 325 public boolean isGreaterThan(Years other) { 326 if (other == null) { 327 return getValue() > 0; 328 } 329 return getValue() > other.getValue(); 330 } 331 332 338 public boolean isLessThan(Years other) { 339 if (other == null) { 340 return getValue() < 0; 341 } 342 return getValue() < other.getValue(); 343 } 344 345 353 public String toString() { 354 return "P" + String.valueOf(getValue()) + "Y"; 355 } 356 357 } 358 | Popular Tags |