1 /* 2 * Copyright 2001-2005 Stephen Colebourne 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package org.joda.time.field; 17 18 import org.joda.time.DurationFieldType; 19 20 /** 21 * Duration field class representing a field with a fixed unit length. 22 * <p> 23 * PreciseDurationField is thread-safe and immutable. 24 * 25 * @author Stephen Colebourne 26 * @author Brian S O'Neill 27 * @since 1.0 28 */ 29 public class PreciseDurationField extends BaseDurationField { 30 31 private static final long serialVersionUID = -8346152187724495365L; 32 33 /** The size of the unit */ 34 private final long iUnitMillis; 35 36 /** 37 * Constructor. 38 * 39 * @param type the field type 40 * @param unitMillis the unit milliseconds 41 */ 42 public PreciseDurationField(DurationFieldType type, long unitMillis) { 43 super(type); 44 iUnitMillis = unitMillis; 45 } 46 47 //------------------------------------------------------------------------ 48 /** 49 * This field is precise. 50 * 51 * @return true always 52 */ 53 public final boolean isPrecise() { 54 return true; 55 } 56 57 /** 58 * Returns the amount of milliseconds per unit value of this field. 59 * 60 * @return the unit size of this field, in milliseconds 61 */ 62 public final long getUnitMillis() { 63 return iUnitMillis; 64 } 65 66 //------------------------------------------------------------------------ 67 /** 68 * Get the value of this field from the milliseconds. 69 * 70 * @param duration the milliseconds to query, which may be negative 71 * @param instant ignored 72 * @return the value of the field, in the units of the field, which may be 73 * negative 74 */ 75 public long getValueAsLong(long duration, long instant) { 76 return duration / iUnitMillis; // safe 77 } 78 79 /** 80 * Get the millisecond duration of this field from its value. 81 * 82 * @param value the value of the field, which may be negative 83 * @param instant ignored 84 * @return the milliseconds that the field represents, which may be 85 * negative 86 */ 87 public long getMillis(int value, long instant) { 88 return value * iUnitMillis; // safe 89 } 90 91 /** 92 * Get the millisecond duration of this field from its value. 93 * 94 * @param value the value of the field, which may be negative 95 * @param instant ignored 96 * @return the milliseconds that the field represents, which may be 97 * negative 98 */ 99 public long getMillis(long value, long instant) { 100 return FieldUtils.safeMultiply(value, iUnitMillis); 101 } 102 103 public long add(long instant, int value) { 104 long addition = value * iUnitMillis; // safe 105 return FieldUtils.safeAdd(instant, addition); 106 } 107 108 public long add(long instant, long value) { 109 long addition = FieldUtils.safeMultiply(value, iUnitMillis); 110 return FieldUtils.safeAdd(instant, addition); 111 } 112 113 public long getDifferenceAsLong(long minuendInstant, long subtrahendInstant) { 114 long difference = FieldUtils.safeSubtract(minuendInstant, subtrahendInstant); 115 return difference / iUnitMillis; 116 } 117 118 //----------------------------------------------------------------------- 119 /** 120 * Compares this duration field to another. 121 * Two fields are equal if of the same type and duration. 122 * 123 * @param obj the object to compare to 124 * @return if equal 125 */ 126 public boolean equals(Object obj) { 127 if (this == obj) { 128 return true; 129 } else if (obj instanceof PreciseDurationField) { 130 PreciseDurationField other = (PreciseDurationField) obj; 131 return (getType() == other.getType()) && (iUnitMillis == other.iUnitMillis); 132 } 133 return false; 134 } 135 136 /** 137 * Gets a hash code for this instance. 138 * 139 * @return a suitable hashcode 140 */ 141 public int hashCode() { 142 long millis = iUnitMillis; 143 int hash = (int) (millis ^ (millis >>> 32)); 144 hash += getType().hashCode(); 145 return hash; 146 } 147 148 }