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    /**
020     * Chronology provides access to the individual date time fields for a
021     * chronological calendar system.
022     * <p>
023     * Various chronologies are supported by subclasses including ISO
024     * and GregorianJulian. To construct a Chronology you should use the
025     * factory methods on the chronology subclass in the chrono package.
026     * <p>
027     * For example, to obtain the current time in the coptic calendar system:
028     * <pre>
029     * DateTime dt = new DateTime(CopticChronology.getInstance());
030     * </pre>
031     * <p>
032     * The provided chronology implementations are:
033     * <ul>
034     * <li>ISO - Based on the ISO8601 standard and suitable for use after about 1600
035     * <li>GJ - Historically accurate calendar with Julian followed by Gregorian
036     * <li>Gregorian - The Gregorian calendar system used for all time (proleptic)
037     * <li>Julian - The Julian calendar system used for all time (proleptic)
038     * <li>Buddhist - The Buddhist calendar system which is an offset in years from GJ
039     * <li>Coptic - The Coptic calendar system which defines 30 day months
040     * <li>Ethiopic - The Ethiopic calendar system which defines 30 day months
041     * </ul>
042     * Hopefully future releases will contain more chronologies.
043     * <p>
044     * This class defines a number of fields with names from the ISO8601 standard.
045     * It does not 'strongly' define these fields however, thus implementations
046     * are free to interpret the field names as they wish.
047     * For example, a week could be defined as 10 days and a month as 40 days in a
048     * special WeirdChronology implementation. Clearly the GJ and ISO
049     * implementations provided use the field names as you would expect.
050     *
051     * @see org.joda.time.chrono.ISOChronology
052     * @see org.joda.time.chrono.GJChronology
053     * @see org.joda.time.chrono.GregorianChronology
054     * @see org.joda.time.chrono.JulianChronology
055     * @see org.joda.time.chrono.CopticChronology
056     * @see org.joda.time.chrono.BuddhistChronology
057     * @see org.joda.time.chrono.EthiopicChronology
058     *
059     * @author Stephen Colebourne
060     * @author Brian S O'Neill
061     * @since 1.0
062     */
063    public abstract class Chronology {
064    
065        /**
066         * Returns the DateTimeZone that this Chronology operates in, or null if
067         * unspecified.
068         *
069         * @return the DateTimeZone, null if unspecified
070         */
071        public abstract DateTimeZone getZone();
072    
073        /**
074         * Returns an instance of this Chronology that operates in the UTC time
075         * zone. Chronologies that do not operate in a time zone or are already
076         * UTC must return themself.
077         *
078         * @return a version of this chronology that ignores time zones
079         */
080        public abstract Chronology withUTC();
081        
082        /**
083         * Returns an instance of this Chronology that operates in any time zone.
084         *
085         * @return a version of this chronology with a specific time zone
086         * @param zone to use, or default if null
087         * @see org.joda.time.chrono.ZonedChronology
088         */
089        public abstract Chronology withZone(DateTimeZone zone);
090    
091        /**
092         * Returns a datetime millisecond instant, formed from the given year,
093         * month, day, and millisecond values. The set of given values must refer
094         * to a valid datetime, or else an IllegalArgumentException is thrown.
095         * <p>
096         * The default implementation calls upon separate DateTimeFields to
097         * determine the result. Subclasses are encouraged to provide a more
098         * efficient implementation.
099         *
100         * @param year year to use
101         * @param monthOfYear month to use
102         * @param dayOfMonth day of month to use
103         * @param millisOfDay millisecond to use
104         * @return millisecond instant from 1970-01-01T00:00:00Z
105         * @throws IllegalArgumentException if the values are invalid
106         */
107        public abstract long getDateTimeMillis(int year, int monthOfYear, int dayOfMonth, int millisOfDay);
108    
109        /**
110         * Returns a datetime millisecond instant, formed from the given year,
111         * month, day, hour, minute, second, and millisecond values. The set of
112         * given values must refer to a valid datetime, or else an
113         * IllegalArgumentException is thrown.
114         * <p>
115         * The default implementation calls upon separate DateTimeFields to
116         * determine the result. Subclasses are encouraged to provide a more
117         * efficient implementation.
118         *
119         * @param year year to use
120         * @param monthOfYear month to use
121         * @param dayOfMonth day of month to use
122         * @param hourOfDay hour to use
123         * @param minuteOfHour minute to use
124         * @param secondOfMinute second to use
125         * @param millisOfSecond millisecond to use
126         * @return millisecond instant from 1970-01-01T00:00:00Z
127         * @throws IllegalArgumentException if the values are invalid
128         */
129        public abstract long getDateTimeMillis(int year, int monthOfYear, int dayOfMonth,
130                               int hourOfDay, int minuteOfHour,
131                               int secondOfMinute, int millisOfSecond);
132    
133        /**
134         * Returns a datetime millisecond instant, from from the given instant,
135         * hour, minute, second, and millisecond values. The set of given values
136         * must refer to a valid datetime, or else an IllegalArgumentException is
137         * thrown.
138         * <p>
139         * The default implementation calls upon separate DateTimeFields to
140         * determine the result. Subclasses are encouraged to provide a more
141         * efficient implementation.
142         *
143         * @param instant instant to start from
144         * @param hourOfDay hour to use
145         * @param minuteOfHour minute to use
146         * @param secondOfMinute second to use
147         * @param millisOfSecond millisecond to use
148         * @return millisecond instant from 1970-01-01T00:00:00Z
149         * @throws IllegalArgumentException if the values are invalid
150         */
151        public abstract long getDateTimeMillis(long instant,
152                               int hourOfDay, int minuteOfHour,
153                               int secondOfMinute, int millisOfSecond);
154    
155        //-----------------------------------------------------------------------
156        /**
157         * Validates whether the values are valid for the fields of a partial instant.
158         *
159         * @param partial  the partial instant to validate
160         * @param values  the values to validate, not null, match fields in partial
161         * @throws IllegalArgumentException if the instant is invalid
162         */
163        public abstract void validate(ReadablePartial partial, int[] values);
164    
165        /**
166         * Gets the values of a partial from an instant.
167         *
168         * @param partial  the partial instant to use
169         * @param instant  the instant to query
170         * @return the values of this partial extracted from the instant
171         */
172        public abstract int[] get(ReadablePartial partial, long instant);
173    
174        /**
175         * Sets the partial into the instant.
176         *
177         * @param partial  the partial instant to use
178         * @param instant  the instant to update
179         * @return the updated instant
180         */
181        public abstract long set(ReadablePartial partial, long instant);
182    
183        //-----------------------------------------------------------------------
184        /**
185         * Gets the values of a period from an interval.
186         *
187         * @param period  the period instant to use
188         * @param startInstant  the start instant of an interval to query
189         * @param endInstant  the start instant of an interval to query
190         * @return the values of the period extracted from the interval
191         */
192        public abstract int[] get(ReadablePeriod period, long startInstant, long endInstant);
193    
194        /**
195         * Gets the values of a period from an interval.
196         *
197         * @param period  the period instant to use
198         * @param duration  the duration to query
199         * @return the values of the period extracted from the duration
200         */
201        public abstract int[] get(ReadablePeriod period, long duration);
202    
203        /**
204         * Adds the period to the instant, specifying the number of times to add.
205         *
206         * @param period  the period to add, null means add nothing
207         * @param instant  the instant to add to
208         * @param scalar  the number of times to add
209         * @return the updated instant
210         */
211        public abstract long add(ReadablePeriod period, long instant, int scalar);
212    
213        //-----------------------------------------------------------------------
214        /**
215         * Adds the duration to the instant, specifying the number of times to add.
216         *
217         * @param instant  the instant to add to
218         * @param duration  the duration to add
219         * @param scalar  the number of times to add
220         * @return the updated instant
221         */
222        public abstract long add(long instant, long duration, int scalar);
223    
224        // Millis
225        //-----------------------------------------------------------------------
226        /**
227         * Get the millis duration field for this chronology.
228         * 
229         * @return DurationField or UnsupportedDurationField if unsupported
230         */
231        public abstract DurationField millis();
232    
233        /**
234         * Get the millis of second field for this chronology.
235         * 
236         * @return DateTimeField or UnsupportedDateTimeField if unsupported
237         */
238        public abstract DateTimeField millisOfSecond();
239    
240        /**
241         * Get the millis of day field for this chronology.
242         * 
243         * @return DateTimeField or UnsupportedDateTimeField if unsupported
244         */
245        public abstract DateTimeField millisOfDay();
246    
247        // Second
248        //-----------------------------------------------------------------------
249        /**
250         * Get the seconds duration field for this chronology.
251         * 
252         * @return DurationField or UnsupportedDurationField if unsupported
253         */
254        public abstract DurationField seconds();
255    
256        /**
257         * Get the second of minute field for this chronology.
258         * 
259         * @return DateTimeField or UnsupportedDateTimeField if unsupported
260         */
261        public abstract DateTimeField secondOfMinute();
262    
263        /**
264         * Get the second of day field for this chronology.
265         * 
266         * @return DateTimeField or UnsupportedDateTimeField if unsupported
267         */
268        public abstract DateTimeField secondOfDay();
269    
270        // Minute
271        //-----------------------------------------------------------------------
272        /**
273         * Get the minutes duration field for this chronology.
274         * 
275         * @return DurationField or UnsupportedDurationField if unsupported
276         */
277        public abstract DurationField minutes();
278    
279        /**
280         * Get the minute of hour field for this chronology.
281         * 
282         * @return DateTimeField or UnsupportedDateTimeField if unsupported
283         */
284        public abstract DateTimeField minuteOfHour();
285    
286        /**
287         * Get the minute of day field for this chronology.
288         * 
289         * @return DateTimeField or UnsupportedDateTimeField if unsupported
290         */
291        public abstract DateTimeField minuteOfDay();
292    
293        // Hour
294        //-----------------------------------------------------------------------
295        /**
296         * Get the hours duration field for this chronology.
297         * 
298         * @return DurationField or UnsupportedDurationField if unsupported
299         */
300        public abstract DurationField hours();
301    
302        /**
303         * Get the hour of day (0-23) field for this chronology.
304         * 
305         * @return DateTimeField or UnsupportedDateTimeField if unsupported
306         */
307        public abstract DateTimeField hourOfDay();
308    
309        /**
310         * Get the hour of day (offset to 1-24) field for this chronology.
311         * 
312         * @return DateTimeField or UnsupportedDateTimeField if unsupported
313         */
314        public abstract DateTimeField clockhourOfDay();
315    
316        // Halfday
317        //-----------------------------------------------------------------------
318        /**
319         * Get the halfdays duration field for this chronology.
320         * 
321         * @return DurationField or UnsupportedDurationField if unsupported
322         */
323        public abstract DurationField halfdays();
324    
325        /**
326         * Get the hour of am/pm (0-11) field for this chronology.
327         * 
328         * @return DateTimeField or UnsupportedDateTimeField if unsupported
329         */
330        public abstract DateTimeField hourOfHalfday();
331    
332        /**
333         * Get the hour of am/pm (offset to 1-12) field for this chronology.
334         * 
335         * @return DateTimeField or UnsupportedDateTimeField if unsupported
336         */
337        public abstract DateTimeField clockhourOfHalfday();
338    
339        /**
340         * Get the AM(0) PM(1) field for this chronology.
341         * 
342         * @return DateTimeField or UnsupportedDateTimeField if unsupported
343         */
344        public abstract DateTimeField halfdayOfDay();
345    
346        // Day
347        //-----------------------------------------------------------------------
348        /**
349         * Get the days duration field for this chronology.
350         * 
351         * @return DurationField or UnsupportedDurationField if unsupported
352         */
353        public abstract DurationField days();
354    
355        /**
356         * Get the day of week field for this chronology.
357         *
358         * <p>DayOfWeek values are defined in {@link DateTimeConstants}.
359         * They use the ISO definitions, where 1 is Monday and 7 is Sunday.
360         * 
361         * @return DateTimeField or UnsupportedDateTimeField if unsupported
362         */
363        public abstract DateTimeField dayOfWeek();
364    
365        /**
366         * Get the day of month field for this chronology.
367         * 
368         * @return DateTimeField or UnsupportedDateTimeField if unsupported
369         */
370        public abstract DateTimeField dayOfMonth();
371    
372        /**
373         * Get the day of year field for this chronology.
374         * 
375         * @return DateTimeField or UnsupportedDateTimeField if unsupported
376         */
377        public abstract DateTimeField dayOfYear();
378    
379        // Week
380        //-----------------------------------------------------------------------
381        /**
382         * Get the weeks duration field for this chronology.
383         * 
384         * @return DurationField or UnsupportedDurationField if unsupported
385         */
386        public abstract DurationField weeks();
387    
388        /**
389         * Get the week of a week based year field for this chronology.
390         * 
391         * @return DateTimeField or UnsupportedDateTimeField if unsupported
392         */
393        public abstract DateTimeField weekOfWeekyear();
394    
395        // Weekyear
396        //-----------------------------------------------------------------------
397        /**
398         * Get the weekyears duration field for this chronology.
399         * 
400         * @return DurationField or UnsupportedDurationField if unsupported
401         */
402        public abstract DurationField weekyears();
403    
404        /**
405         * Get the year of a week based year field for this chronology.
406         * 
407         * @return DateTimeField or UnsupportedDateTimeField if unsupported
408         */
409        public abstract DateTimeField weekyear();
410    
411        /**
412         * Get the year of a week based year in a century field for this chronology.
413         * 
414         * @return DateTimeField or UnsupportedDateTimeField if unsupported
415         */
416        public abstract  DateTimeField weekyearOfCentury();
417    
418        // Month
419        //-----------------------------------------------------------------------
420        /**
421         * Get the months duration field for this chronology.
422         * 
423         * @return DurationField or UnsupportedDurationField if unsupported
424         */
425        public abstract DurationField months();
426    
427        /**
428         * Get the month of year field for this chronology.
429         * 
430         * @return DateTimeField or UnsupportedDateTimeField if unsupported
431         */
432        public abstract DateTimeField monthOfYear();
433    
434        // Year
435        //-----------------------------------------------------------------------
436        /**
437         * Get the years duration field for this chronology.
438         * 
439         * @return DurationField or UnsupportedDurationField if unsupported
440         */
441        public abstract DurationField years();
442    
443        /**
444         * Get the year field for this chronology.
445         * 
446         * @return DateTimeField or UnsupportedDateTimeField if unsupported
447         */
448        public abstract DateTimeField year();
449    
450        /**
451         * Get the year of era field for this chronology.
452         * 
453         * @return DateTimeField or UnsupportedDateTimeField if unsupported
454         */
455        public abstract DateTimeField yearOfEra();
456    
457        /**
458         * Get the year of century field for this chronology.
459         * 
460         * @return DateTimeField or UnsupportedDateTimeField if unsupported
461         */
462        public abstract DateTimeField yearOfCentury();
463    
464        // Century
465        //-----------------------------------------------------------------------
466        /**
467         * Get the centuries duration field for this chronology.
468         * 
469         * @return DurationField or UnsupportedDurationField if unsupported
470         */
471        public abstract DurationField centuries();
472    
473        /**
474         * Get the century of era field for this chronology.
475         * 
476         * @return DateTimeField or UnsupportedDateTimeField if unsupported
477         */
478        public abstract DateTimeField centuryOfEra();
479    
480        // Era
481        //-----------------------------------------------------------------------
482        /**
483         * Get the eras duration field for this chronology.
484         * 
485         * @return DurationField or UnsupportedDurationField if unsupported
486         */
487        public abstract DurationField eras();
488    
489        /**
490         * Get the era field for this chronology.
491         * 
492         * @return DateTimeField or UnsupportedDateTimeField if unsupported
493         */
494        public abstract DateTimeField era();
495    
496        //-----------------------------------------------------------------------
497        /**
498         * Gets a debugging toString.
499         * 
500         * @return a debugging string
501         */
502        public abstract String toString();
503    
504    }