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    
025    /**
026     * A factory for creating {@link DateTime date-time instants}. This interface extends the {@link ValueFactory} generic interface
027     * and adds specific methods for creating instants for the current time (and time zone) as well as various combinations of
028     * individual field values. <h2>ISO-8601</h2>
029     * <p>
030     * The factory creates date-time instants from strings that are in the standard ISO-8601 format. There are three supported styles:
031     * month-based, day-of-year-based, and week-based.
032     * </p>
033     * <h3>Month-Based</h3>
034     * <p>
035     * The month-based representation is the most common format of ISO8601, and is the format used in the XML standards for passing
036     * dates and times:
037     * 
038     * <pre>
039     * yyyy-mm-ddTHH:MM:SS.SSSZ
040     * </pre>
041     * 
042     * The fields are separated by dashes and consist of:
043     * <ul>
044     * <li>four digit year;</li>
045     * <li>two digit month, where 01 is Janurary and 12 is December;</li>
046     * <li>two digit day of month, from 01 to 31;</li>
047     * <li>two digit hour, from 00 to 23;</li>
048     * <li>two digit minute, from 00 to 59;</li>
049     * <li>two digit second, from 00 to 59;</li>
050     * <li>three decimal places for milliseconds, if required;</li>
051     * <li>time zone offset of the form <code>±HH:mm</code> (or '0' if UTC)</li>
052     * </ul>
053     * </p>
054     * <h3>Day of Year Based</h3>
055     * <p>
056     * This format of ISO-8601 uses a single field to represent the day of the year:
057     * 
058     * <pre>
059     * yyyy-dddTHH:MM:SS.SSSZ
060     * </pre>
061     * 
062     * The fields are separated by dashes and consist of:
063     * <ul>
064     * <li>four digit year</li>
065     * <li>three digit day of year, from 001 to 366;</li>
066     * <li>two digit hour, from 00 to 23;</li>
067     * <li>two digit minute, from 00 to 59;</li>
068     * <li>two digit second, from 00 to 59;</li>
069     * <li>three decimal places for milliseconds, if required;</li>
070     * <li>time zone offset of the form <code>±HH:mm</code> (or '0' if UTC)</li>
071     * </ul>
072     * </p>
073     * <h3>Week Based</h3>
074     * <p>
075     * This format of ISO-8601 uses a single field to represent the day of the year:
076     * 
077     * <pre>
078     * yyyy-Www-dTHH:MM:SS.SSSZ
079     * </pre>
080     * 
081     * The fields are separated by dashes and consist of:
082     * <ul>
083     * <li>four digit weekyear (see below)</li>
084     * <li>two digit week of year, from 01 to 53;</li>
085     * <li>one digit day of week, from 1 to 7 where 1 is Monday and 7 is Sunday;</li>
086     * <li>two digit hour, from 00 to 23;</li>
087     * <li>two digit minute, from 00 to 59;</li>
088     * <li>two digit second, from 00 to 59;</li>
089     * <li>three decimal places for milliseconds, if required;</li>
090     * <li>time zone offset of the form <code>±HH:mm</code> (or '0' if UTC)</li>
091     * </ul>
092     * </p>
093     * <p>
094     * From <a href="http://joda-time.sourceforge.net/cal_iso.html">Joda-Time</a>: Weeks are always complete, and the first week of a
095     * year is the one that includes the first Thursday of the year. This definition can mean that the first week of a year starts in
096     * the previous year, and the last week finishes in the next year. The weekyear field is defined to refer to the year that owns
097     * the week, which may differ from the actual year.
098     * </p>
099     * 
100     * @author Randall Hauch
101     */
102    public interface DateTimeFactory extends ValueFactory<DateTime> {
103    
104        /**
105         * Create a date-time instance for the current time in the local time zone.
106         * 
107         * @return the current date-time instance
108         * @see #createUtc()
109         */
110        DateTime create();
111    
112        /**
113         * Create a date-time instance for the current time in UTC.
114         * 
115         * @return the current date-time instance (in UTC)
116         * @see #create()
117         */
118        DateTime createUtc();
119    
120        /**
121         * Create a date-time instance that is offset from the original by the specified amount.
122         * 
123         * @param original
124         * @param offsetInMillis the offset in milliseconds (positive or negative)
125         * @return the offset date-time instance
126         */
127        DateTime create( DateTime original,
128                         long offsetInMillis );
129    
130        /**
131         * Create a date-time instance given the individual values for the fields
132         * 
133         * @param year the year of the era
134         * @param monthOfYear the month of the year
135         * @param dayOfMonth the day of the month
136         * @param hourOfDay the hour of the day
137         * @param minuteOfHour the minute of the hour
138         * @param secondOfMinute the second of the minute
139         * @param millisecondsOfSecond the milliseconds of the second
140         * @return the date-time instance
141         */
142        DateTime create( int year,
143                         int monthOfYear,
144                         int dayOfMonth,
145                         int hourOfDay,
146                         int minuteOfHour,
147                         int secondOfMinute,
148                         int millisecondsOfSecond );
149    
150        /**
151         * Create a date-time instance given the individual values for the fields
152         * 
153         * @param year the year of the era
154         * @param monthOfYear the month of the year
155         * @param dayOfMonth the day of the month
156         * @param hourOfDay the hour of the day
157         * @param minuteOfHour the minute of the hour
158         * @param secondOfMinute the second of the minute
159         * @param millisecondsOfSecond the milliseconds of the second
160         * @param timeZoneOffsetHours the number of hours offset from UTC for the time zone
161         * @return the date-time instance
162         */
163        DateTime create( int year,
164                         int monthOfYear,
165                         int dayOfMonth,
166                         int hourOfDay,
167                         int minuteOfHour,
168                         int secondOfMinute,
169                         int millisecondsOfSecond,
170                         int timeZoneOffsetHours );
171    
172        /**
173         * Create a date-time instance given the individual values for the fields
174         * 
175         * @param year the year of the era
176         * @param monthOfYear the month of the year
177         * @param dayOfMonth the day of the month
178         * @param hourOfDay the hour of the day
179         * @param minuteOfHour the minute of the hour
180         * @param secondOfMinute the second of the minute
181         * @param millisecondsOfSecond the milliseconds of the second
182         * @param timeZoneId the ID of the time zone (e.g, "PST", "UTC", "EDT"); may not be null
183         * @return the date-time instance
184         */
185        DateTime create( int year,
186                         int monthOfYear,
187                         int dayOfMonth,
188                         int hourOfDay,
189                         int minuteOfHour,
190                         int secondOfMinute,
191                         int millisecondsOfSecond,
192                         String timeZoneId );
193    
194    }