1 16 package org.joda.time.field; 17 18 import org.joda.time.DateTimeFieldType; 19 import org.joda.time.DurationField; 20 21 30 public abstract class PreciseDurationDateTimeField extends BaseDateTimeField { 31 32 private static final long serialVersionUID = 5004523158306266035L; 33 34 35 final long iUnitMillis; 36 37 private final DurationField iUnitField; 38 39 47 public PreciseDurationDateTimeField(DateTimeFieldType type, DurationField unit) { 48 super(type); 49 50 if (!unit.isPrecise()) { 51 throw new IllegalArgumentException ("Unit duration field must be precise"); 52 } 53 54 iUnitMillis = unit.getUnitMillis(); 55 if (iUnitMillis < 1) { 56 throw new IllegalArgumentException ("The unit milliseconds must be at least 1"); 57 } 58 59 iUnitField = unit; 60 } 61 62 65 public boolean isLenient() { 66 return false; 67 } 68 69 77 public long set(long instant, int value) { 78 FieldUtils.verifyValueBounds(this, value, getMinimumValue(), 79 getMaximumValueForSet(instant, value)); 80 return instant + (value - get(instant)) * iUnitMillis; 81 } 82 83 91 public long roundFloor(long instant) { 92 if (instant >= 0) { 93 return instant - instant % iUnitMillis; 94 } else { 95 instant += 1; 96 return instant - instant % iUnitMillis - iUnitMillis; 97 } 98 } 99 100 108 public long roundCeiling(long instant) { 109 if (instant > 0) { 110 instant -= 1; 111 return instant - instant % iUnitMillis + iUnitMillis; 112 } else { 113 return instant - instant % iUnitMillis; 114 } 115 } 116 117 125 public long remainder(long instant) { 126 if (instant >= 0) { 127 return instant % iUnitMillis; 128 } else { 129 return (instant + 1) % iUnitMillis + iUnitMillis - 1; 130 } 131 } 132 133 140 public DurationField getDurationField() { 141 return iUnitField; 142 } 143 144 149 public int getMinimumValue() { 150 return 0; 151 } 152 153 public final long getUnitMillis() { 154 return iUnitMillis; 155 } 156 157 162 protected int getMaximumValueForSet(long instant, int value) { 163 return getMaximumValue(instant); 164 } 165 166 } 167 | Popular Tags |