001    /*
002     * JBoss, Home of Professional Open Source.
003     * Copyright 2008, Red Hat Middleware LLC, and individual contributors
004     * as indicated by the @author tags. See the copyright.txt file in the
005     * distribution for a full listing of individual contributors. 
006     *
007     * This is free software; you can redistribute it and/or modify it
008     * under the terms of the GNU Lesser General Public License as
009     * published by the Free Software Foundation; either version 2.1 of
010     * the License, or (at your option) any later version.
011     *
012     * This software is distributed in the hope that it will be useful,
013     * but WITHOUT ANY WARRANTY; without even the implied warranty of
014     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015     * Lesser General Public License for more details.
016     *
017     * You should have received a copy of the GNU Lesser General Public
018     * License along with this software; if not, write to the Free
019     * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020     * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021     */
022    package org.jboss.dna.graph.properties;
023    
024    import java.io.Serializable;
025    import java.util.Locale;
026    import java.util.concurrent.TimeUnit;
027    import net.jcip.annotations.Immutable;
028    
029    /**
030     * An immutable date-time class that represents an instance in time. This class is designed to hide the horrible implementations
031     * of the JDK date and calendar classes, which are being overhauled (and replaced) under <a
032     * href="http://jcp.org/en/jsr/detail?id=310">JSR-310</a>, which will be based upon <a
033     * href="http://joda-time.sourceforge.net/">Joda-Time</a>. This class serves as a stable migration path toward the new JSR 310
034     * classes.
035     * 
036     * @author Randall Hauch
037     */
038    @Immutable
039    public interface DateTime extends Comparable<DateTime>, Serializable {
040    
041        /**
042         * Get the ISO-8601 representation of this instance in time. The month-based ISO-8601 representation is the most common format
043         * of ISO8601, and is the format used in the XML standards for passing dates and times:
044         * 
045         * <pre>
046         * yyyy-mm-ddTHH:MM:SS.SSSZ
047         * </pre>
048         * 
049         * The fields are separated by dashes and consist of:
050         * <ul>
051         * <li>four digit year;</li>
052         * <li>two digit month, where 01 is Janurary and 12 is December;</li>
053         * <li>two digit day of month, from 01 to 31;</li>
054         * <li>two digit hour, from 00 to 23;</li>
055         * <li>two digit minute, from 00 to 59;</li>
056         * <li>two digit second, from 00 to 59;</li>
057         * <li>three decimal places for milliseconds, if required;</li>
058         * <li>time zone offset of the form <code>±HH:mm</code> (or '0' if UTC)</li>
059         * </ul>
060         * 
061         * @return the string representation; never null
062         */
063        String getString();
064    
065        /**
066         * Get the number of milliseconds from 1970-01-01T00:00Z. This value is consistent with the JDK {@link java.util.Date Date}
067         * and {@link java.util.Calendar Calendar} classes.
068         * 
069         * @return the number of milliseconds from 1970-01-01T00:00Z
070         */
071        long getMilliseconds();
072    
073        /**
074         * Get this instance represented as a standard JDK {@link java.util.Date} instance. Note that this conversion loses the time
075         * zone information, as the standard JDK {@link java.util.Date} does not represent time zones.
076         * 
077         * @return this instance in time as a JDK Date; never null
078         */
079        java.util.Date toDate();
080    
081        /**
082         * Get this instance represented as a standard JDK {@link java.util.Calendar} instance, in the {@link Locale#getDefault()
083         * default locale}.
084         * 
085         * @return this instance in time as a JDK Calendar; never null
086         */
087        java.util.Calendar toCalendar();
088    
089        /**
090         * Get this instance represented as a standard JDK {@link java.util.Calendar} instance, in the specified {@link Locale locale}
091         * .
092         * 
093         * @param locale the locale in which the Calendar instance is desired; may be null if the {@link Locale#getDefault() default
094         *        locale} is to be used.
095         * @return this instance in time as a JDK Calendar; never null
096         */
097        java.util.Calendar toCalendar( Locale locale );
098    
099        /**
100         * Get this instance represented as a standard JDK {@link java.util.GregorianCalendar} instance.
101         * 
102         * @return this instance in time as a JDK GregorianCalendar; never null
103         */
104        java.util.GregorianCalendar toGregorianCalendar();
105    
106        /**
107         * Get the era of this instance in time.
108         * 
109         * @return the era
110         */
111        int getEra();
112    
113        /**
114         * Get the era of this instance in time.
115         * 
116         * @return the era
117         */
118        int getYear();
119    
120        /**
121         * Get the era of this instance in time.
122         * 
123         * @return the era
124         */
125        int getWeekyear();
126    
127        /**
128         * Get the era of this instance in time.
129         * 
130         * @return the era
131         */
132        int getCenturyOfEra();
133    
134        /**
135         * Get the year of the era of this instance in time.
136         * 
137         * @return the year of the era
138         */
139        int getYearOfEra();
140    
141        /**
142         * Get the year of this century of this instance in time.
143         * 
144         * @return the year of the century
145         */
146        int getYearOfCentury();
147    
148        /**
149         * Get the month of the year of this instance in time.
150         * 
151         * @return the month number
152         */
153        int getMonthOfYear();
154    
155        /**
156         * Get the week of the weekyear of this instance in time.
157         * 
158         * @return the week of the weekyear
159         */
160        int getWeekOfWeekyear();
161    
162        /**
163         * Get the day of the year of this instance in time.
164         * 
165         * @return the day of the year
166         */
167        int getDayOfYear();
168    
169        /**
170         * Get the day of the month value of this instance in time.
171         * 
172         * @return the day of the month
173         */
174        int getDayOfMonth();
175    
176        /**
177         * Get the day of the week value of this instance in time.
178         * 
179         * @return the day of the week
180         */
181        int getDayOfWeek();
182    
183        /**
184         * Get the hour of the day of this instance in time.
185         * 
186         * @return the hour of the day
187         */
188        int getHourOfDay();
189    
190        /**
191         * Get the minute of this instance in time.
192         * 
193         * @return the minute of the hour
194         */
195        int getMinuteOfHour();
196    
197        /**
198         * Get the seconds of the minute value of this instance in time.
199         * 
200         * @return the seconds of the minute
201         */
202        int getSecondOfMinute();
203    
204        /**
205         * Get the milliseconds of the second value of this instance in time.
206         * 
207         * @return the milliseconds
208         */
209        int getMillisOfSecond();
210    
211        /**
212         * Get the number of hours that this time zone is offset from UTC.
213         * 
214         * @return the number of hours
215         */
216        int getTimeZoneOffsetHours();
217    
218        /**
219         * Get the identifier of the time zone in which this instant is defined
220         * 
221         * @return the time zone identifier; never null
222         */
223        String getTimeZoneId();
224    
225        /**
226         * Convert this time to the same instant in the UTC time zone.
227         * 
228         * @return this instant in time in the specified time zone
229         */
230        DateTime toUtcTimeZone();
231    
232        /**
233         * Convert this time to the time zone given by the supplied identifier.
234         * 
235         * @param timeZoneId the time zone identifier
236         * @return the instant in the specified time zone
237         * @throws IllegalArgumentException if the time zone identifier is null or is invalid
238         */
239        DateTime toTimeZone( String timeZoneId );
240    
241        /**
242         * Return whether this date-time is earlier than the supplied date-time.
243         * 
244         * @param other the date-time to compare with
245         * @return true if this date-time is earliar than the other, or false otherwise
246         * @see #compareTo(DateTime)
247         * @see #isSameAs(DateTime)
248         * @see #isAfter(DateTime)
249         */
250        boolean isBefore( DateTime other );
251    
252        /**
253         * Return whether this date-time is later than the supplied date-time.
254         * 
255         * @param other the date-time to compare with
256         * @return true if this date-time is later than the other, or false otherwise
257         * @see #compareTo(DateTime)
258         * @see #isBefore(DateTime)
259         * @see #isSameAs(DateTime)
260         */
261        boolean isAfter( DateTime other );
262    
263        /**
264         * Return whether this date-time is at the same time as the supplied date-time.
265         * 
266         * @param other the date-time to compare with
267         * @return true if this date-time is later than the other, or false otherwise
268         * @see #compareTo(DateTime)
269         * @see #isBefore(DateTime)
270         * @see #isAfter(DateTime)
271         */
272        boolean isSameAs( DateTime other );
273    
274        /**
275         * Subtract the specified about of time in the supplied units.
276         * 
277         * @param timeAmount the amount of time to subtract
278         * @param unit the units of the amount of time; may not be null
279         * @return the instance in time the specified number of time before this instant
280         */
281        DateTime minus( long timeAmount,
282                        TimeUnit unit );
283    
284        /**
285         * Subtract the specified number of days from this time instant.
286         * 
287         * @param days the number of days to subtract
288         * @return the instance in time the specified number of days before this instant
289         */
290        DateTime minusDays( int days );
291    
292        /**
293         * Subtract the specified number of hours from this time instant.
294         * 
295         * @param hours the number of hours to subtract
296         * @return the instance in time the specified number of hours before this instant
297         */
298        DateTime minusHours( int hours );
299    
300        /**
301         * Subtract the specified number of milliseconds from this time instant.
302         * 
303         * @param milliseconds the number of milliseconds to subtract
304         * @return the instance in time the specified number of milliseconds before this instant
305         */
306        DateTime minusMillis( int milliseconds );
307    
308        /**
309         * Subtract the specified number of minutes from this time instant.
310         * 
311         * @param minutes the number of minutes to subtract
312         * @return the instance in time the specified number of minutes before this instant
313         */
314        DateTime minusMinutes( int minutes );
315    
316        /**
317         * Subtract the specified number of months from this time instant.
318         * 
319         * @param months the number of months to subtract
320         * @return the instance in time the specified number of months before this instant
321         */
322        DateTime minusMonths( int months );
323    
324        /**
325         * Subtract the specified number of seconds from this time instant.
326         * 
327         * @param seconds the number of seconds to subtract
328         * @return the instance in time the specified number of seconds before this instant
329         */
330        DateTime minusSeconds( int seconds );
331    
332        /**
333         * Subtract the specified number of weeks from this time instant.
334         * 
335         * @param weeks the number of weeks to subtract
336         * @return the instance in time the specified number of weeks before this instant
337         */
338        DateTime minusWeeks( int weeks );
339    
340        /**
341         * Subtract the specified number of years from this time instant.
342         * 
343         * @param years the number of years to subtract
344         * @return the instance in time the specified number of years before this instant
345         */
346        DateTime minusYears( int years );
347    
348        /**
349         * Add the specified about of time in the supplied units.
350         * 
351         * @param timeAmount the amount of time to add
352         * @param unit the units of the amount of time; may not be null
353         * @return the instance in time the specified number of time after this instant
354         */
355        DateTime plus( long timeAmount,
356                       TimeUnit unit );
357    
358        /**
359         * Add the specified number of days from this time instant.
360         * 
361         * @param days the number of days to add
362         * @return the instance in time the specified number of days after this instant
363         */
364        DateTime plusDays( int days );
365    
366        /**
367         * Add the specified number of hours from this time instant.
368         * 
369         * @param hours the number of hours to add
370         * @return the instance in time the specified number of hours after this instant
371         */
372        DateTime plusHours( int hours );
373    
374        /**
375         * Add the specified number of milliseconds from this time instant.
376         * 
377         * @param milliseconds the number of milliseconds to add
378         * @return the instance in time the specified number of milliseconds after this instant
379         */
380        DateTime plusMillis( int milliseconds );
381    
382        /**
383         * Add the specified number of minutes from this time instant.
384         * 
385         * @param minutes the number of minutes to add
386         * @return the instance in time the specified number of minutes after this instant
387         */
388        DateTime plusMinutes( int minutes );
389    
390        /**
391         * Add the specified number of months from this time instant.
392         * 
393         * @param months the number of months to add
394         * @return the instance in time the specified number of months after this instant
395         */
396        DateTime plusMonths( int months );
397    
398        /**
399         * Add the specified number of seconds from this time instant.
400         * 
401         * @param seconds the number of seconds to add
402         * @return the instance in time the specified number of seconds after this instant
403         */
404        DateTime plusSeconds( int seconds );
405    
406        /**
407         * Add the specified number of weeks from this time instant.
408         * 
409         * @param weeks the number of weeks to add
410         * @return the instance in time the specified number of weeks after this instant
411         */
412        DateTime plusWeeks( int weeks );
413    
414        /**
415         * Add the specified number of years from this time instant.
416         * 
417         * @param years the number of years to add
418         * @return the instance in time the specified number of years after this instant
419         */
420        DateTime plusYears( int years );
421    
422    }