001: /*
002: * Copyright 2001-2005 Stephen Colebourne
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.joda.time;
017:
018: /**
019: * Defines an exact duration of time in milliseconds.
020: * <p>
021: * The implementation of this interface may be mutable or immutable. This
022: * interface only gives access to retrieve data, never to change it.
023: * <p>
024: * Methods that are passed a duration as a parameter will treat <code>null</code>
025: * as a zero length duration.
026: *
027: * @see ReadableInterval
028: * @see ReadablePeriod
029: * @author Brian S O'Neill
030: * @author Stephen Colebourne
031: * @since 1.0
032: */
033: public interface ReadableDuration extends Comparable {
034:
035: /**
036: * Gets the total length of this duration in milliseconds.
037: *
038: * @return the total length of the time duration in milliseconds.
039: */
040: long getMillis();
041:
042: //-----------------------------------------------------------------------
043: /**
044: * Get this duration as an immutable <code>Duration</code> object.
045: * <p>
046: * This will either typecast this instance, or create a new <code>Duration</code>.
047: *
048: * @return a Duration created using the millisecond duration from this instance
049: */
050: Duration toDuration();
051:
052: //-----------------------------------------------------------------------
053: /**
054: * Converts this duration to a Period instance using the standard period type
055: * and the ISO chronology.
056: * <p>
057: * Only precise fields in the period type will be used. Thus, only the hour,
058: * minute, second and millisecond fields on the period will be used.
059: * The year, month, week and day fields will not be populated.
060: * <p>
061: * If the duration is small, less than one day, then this method will perform
062: * as you might expect and split the fields evenly.
063: * If the duration is larger than one day then all the remaining duration will
064: * be stored in the largest available field, hours in this case.
065: * <p>
066: * For example, a duration effectively equal to (365 + 60 + 5) days will be
067: * converted to ((365 + 60 + 5) * 24) hours by this constructor.
068: * <p>
069: * For more control over the conversion process, you must pair the duration with
070: * an instant, see {@link Period#Period(ReadableInstant,ReadableDuration)}.
071: *
072: * @return a Period created using the millisecond duration from this instance
073: */
074: Period toPeriod();
075:
076: //-----------------------------------------------------------------------
077: /**
078: * Compares this duration with the specified duration based on length.
079: *
080: * @param obj a duration to check against
081: * @return negative value if this is less, 0 if equal, or positive value if greater
082: * @throws NullPointerException if the object is null
083: * @throws ClassCastException if the given object is not supported
084: */
085: int compareTo(Object obj);
086:
087: /**
088: * Is the length of this duration equal to the duration passed in.
089: *
090: * @param duration another duration to compare to, null means zero milliseconds
091: * @return true if this duration is equal to than the duration passed in
092: */
093: boolean isEqual(ReadableDuration duration);
094:
095: /**
096: * Is the length of this duration longer than the duration passed in.
097: *
098: * @param duration another duration to compare to, null means zero milliseconds
099: * @return true if this duration is equal to than the duration passed in
100: */
101: boolean isLongerThan(ReadableDuration duration);
102:
103: /**
104: * Is the length of this duration shorter than the duration passed in.
105: *
106: * @param duration another duration to compare to, null means zero milliseconds
107: * @return true if this duration is equal to than the duration passed in
108: */
109: boolean isShorterThan(ReadableDuration duration);
110:
111: //-----------------------------------------------------------------------
112: /**
113: * Compares this object with the specified object for equality based
114: * on the millisecond length. All ReadableDuration instances are accepted.
115: *
116: * @param readableDuration a readable duration to check against
117: * @return true if the length of the duration is equal
118: */
119: boolean equals(Object readableDuration);
120:
121: /**
122: * Gets a hash code for the duration that is compatable with the
123: * equals method.
124: * The following formula must be used:
125: * <pre>
126: * long len = getMillis();
127: * return (int) (len ^ (len >>> 32));
128: * </pre>
129: *
130: * @return a hash code
131: */
132: int hashCode();
133:
134: //-----------------------------------------------------------------------
135: /**
136: * Gets the value as a String in the ISO8601 duration format using hours,
137: * minutes and seconds (including fractional milliseconds).
138: * <p>
139: * For example, "PT6H3M7S" represents 6 hours, 3 minutes, 7 seconds.
140: *
141: * @return the value as an ISO8601 string
142: */
143: String toString();
144:
145: }
|