001    /*
002     *  Copyright 2001-2009 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 instant in the datetime continuum.
020     * This interface expresses the datetime as milliseconds from 1970-01-01T00:00:00Z.
021     * <p>
022     * The implementation of this interface may be mutable or immutable.
023     * This interface only gives access to retrieve data, never to change it.
024     * <p>
025     * Methods in your application should be defined using <code>ReadableInstant</code>
026     * as a parameter if the method only wants to read the instant without needing to know
027     * the specific datetime fields.
028     * <p>
029     * The {@code compareTo} method is no longer defined in this class in version 2.0.
030     * Instead, the definition is simply inherited from the {@code Comparable} interface.
031     * This approach is necessary to preserve binary compatibility.
032     * The definition of the comparison is ascending order by millisecond instant.
033     * Implementors are recommended to extend {@code AbstractInstant} instead of this interface.
034     *
035     * @author Stephen Colebourne
036     * @since 1.0
037     */
038    public interface ReadableInstant extends Comparable<ReadableInstant> {
039    
040        /**
041         * Get the value as the number of milliseconds since
042         * the epoch, 1970-01-01T00:00:00Z.
043         *
044         * @return the value as milliseconds
045         */
046        long getMillis();
047    
048        /**
049         * Gets the chronology of the instant.
050         * <p>
051         * The {@link Chronology} provides conversion from the millisecond
052         * value to meaningful fields in a particular calendar system.
053         * 
054         * @return the Chronology, never null
055         */
056        Chronology getChronology();
057    
058        /**
059         * Gets the time zone of the instant from the chronology.
060         * 
061         * @return the DateTimeZone that the instant is using, never null
062         */
063        DateTimeZone getZone();
064    
065        /**
066         * Get the value of one of the fields of a datetime.
067         * <p>
068         * This method uses the chronology of the instant to obtain the value.
069         *
070         * @param type  a field type, usually obtained from DateTimeFieldType, not null
071         * @return the value of that field
072         * @throws IllegalArgumentException if the field type is null
073         */
074        int get(DateTimeFieldType type);
075    
076        /**
077         * Checks whether the field type specified is supported by this implementation.
078         *
079         * @param field  the field type to check, may be null which returns false
080         * @return true if the field is supported
081         */
082        boolean isSupported(DateTimeFieldType field);
083    
084        //-----------------------------------------------------------------------
085        /**
086         * Get the value as a simple immutable <code>Instant</code> object.
087         * <p>
088         * This can be useful if you don't trust the implementation
089         * of the interface to be well-behaved, or to get a guaranteed
090         * immutable object.
091         *
092         * @return the value as an <code>Instant</code> object
093         */
094        Instant toInstant();
095    
096        //-----------------------------------------------------------------------
097        // Method is no longer defined here as that would break generic backwards compatibility
098    //    /**
099    //     * Compares this object with the specified object for ascending
100    //     * millisecond instant order. This ordering is inconsistent with
101    //     * equals, as it ignores the Chronology.
102    //     * <p>
103    //     * All ReadableInstant instances are accepted.
104    //     *
105    //     * @param readableInstant  a readable instant to check against
106    //     * @return negative value if this is less, 0 if equal, or positive value if greater
107    //     * @throws NullPointerException if the object is null
108    //     * @throws ClassCastException if the object type is not supported
109    //     */
110    //    int compareTo(ReadableInstant readableInstant);
111    
112        //-----------------------------------------------------------------------
113        /**
114         * Is this instant equal to the instant passed in
115         * comparing solely by millisecond.
116         *
117         * @param instant  an instant to check against, null means now
118         * @return true if the instant is equal to the instant passed in
119         */
120        boolean isEqual(ReadableInstant instant);
121    
122        /**
123         * Is this instant after the instant passed in
124         * comparing solely by millisecond.
125         *
126         * @param instant  an instant to check against, null means now
127         * @return true if the instant is after the instant passed in
128         */
129        boolean isAfter(ReadableInstant instant);
130    
131        /**
132         * Is this instant before the instant passed in
133         * comparing solely by millisecond.
134         *
135         * @param instant  an instant to check against, null means now
136         * @return true if the instant is before the instant passed in
137         */
138        boolean isBefore(ReadableInstant instant);
139    
140        //-----------------------------------------------------------------------
141        /**
142         * Compares this object with the specified object for equality based
143         * on the millisecond instant and the Chronology. All ReadableInstant
144         * instances are accepted.
145         * <p>
146         * To compare two instants for absolute time (ie. UTC milliseconds 
147         * ignoring the chronology), use {@link #isEqual(ReadableInstant)} or
148         * {@link #compareTo(Object)}.
149         *
150         * @param readableInstant  a readable instant to check against
151         * @return true if millisecond and chronology are equal, false if
152         *  not or the instant is null or of an incorrect type
153         */
154        boolean equals(Object readableInstant);
155    
156        /**
157         * Gets a hash code for the instant that is compatible with the 
158         * equals method.
159         * <p>
160         * The formula used must be as follows:
161         * <pre>
162         * ((int) (getMillis() ^ (getMillis() >>> 32))) +
163         * (getChronology().hashCode())
164         * </pre>
165         *
166         * @return a hash code as defined above
167         */
168        int hashCode();
169    
170        //-----------------------------------------------------------------------
171        /**
172         * Get the value as a String in a recognisable ISO8601 format.
173         * <p>
174         * The string output is in ISO8601 format to enable the String
175         * constructor to correctly parse it.
176         *
177         * @return the value as an ISO8601 string
178         */
179        String toString();
180    
181    }