View Javadoc

1   /*
2    * ModeShape (http://www.modeshape.org)
3    * See the COPYRIGHT.txt file distributed with this work for information
4    * regarding copyright ownership.  Some portions may be licensed
5    * to Red Hat, Inc. under one or more contributor license agreements.
6    * See the AUTHORS.txt file in the distribution for a full listing of 
7    * individual contributors. 
8    *
9    * ModeShape is free software. Unless otherwise indicated, all code in ModeShape
10   * is licensed to you under the terms of the GNU Lesser General Public License as
11   * published by the Free Software Foundation; either version 2.1 of
12   * the License, or (at your option) any later version.
13   *
14   * ModeShape is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17   * Lesser General Public License for more details.
18   *
19   * You should have received a copy of the GNU Lesser General Public
20   * License along with this software; if not, write to the Free
21   * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
22   * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
23   */
24  package org.modeshape.graph.property;
25  
26  /**
27   * A factory for creating {@link DateTime date-time instants}. This interface extends the {@link ValueFactory} generic interface
28   * and adds specific methods for creating instants for the current time (and time zone) as well as various combinations of
29   * individual field values. <h2>ISO-8601</h2>
30   * <p>
31   * The factory creates date-time instants from strings that are in the standard ISO-8601 format. There are three supported styles:
32   * month-based, day-of-year-based, and week-based.
33   * </p>
34   * <h3>Month-Based</h3>
35   * <p>
36   * The month-based representation is the most common format of ISO8601, and is the format used in the XML standards for passing
37   * dates and times:
38   * 
39   * <pre>
40   * yyyy-mm-ddTHH:MM:SS.SSSZ
41   * </pre>
42   * 
43   * The fields are separated by dashes and consist of:
44   * <ul>
45   * <li>four digit year;</li>
46   * <li>two digit month, where 01 is Janurary and 12 is December;</li>
47   * <li>two digit day of month, from 01 to 31;</li>
48   * <li>two digit hour, from 00 to 23;</li>
49   * <li>two digit minute, from 00 to 59;</li>
50   * <li>two digit second, from 00 to 59;</li>
51   * <li>three decimal places for milliseconds, if required;</li>
52   * <li>time zone offset of the form <code>�HH:mm</code> (or '0' if UTC)</li>
53   * </ul>
54   * </p>
55   * <h3>Day of Year Based</h3>
56   * <p>
57   * This format of ISO-8601 uses a single field to represent the day of the year:
58   * 
59   * <pre>
60   * yyyy-dddTHH:MM:SS.SSSZ
61   * </pre>
62   * 
63   * The fields are separated by dashes and consist of:
64   * <ul>
65   * <li>four digit year</li>
66   * <li>three digit day of year, from 001 to 366;</li>
67   * <li>two digit hour, from 00 to 23;</li>
68   * <li>two digit minute, from 00 to 59;</li>
69   * <li>two digit second, from 00 to 59;</li>
70   * <li>three decimal places for milliseconds, if required;</li>
71   * <li>time zone offset of the form <code>�HH:mm</code> (or '0' if UTC)</li>
72   * </ul>
73   * </p>
74   * <h3>Week Based</h3>
75   * <p>
76   * This format of ISO-8601 uses a single field to represent the day of the year:
77   * 
78   * <pre>
79   * yyyy-Www-dTHH:MM:SS.SSSZ
80   * </pre>
81   * 
82   * The fields are separated by dashes and consist of:
83   * <ul>
84   * <li>four digit weekyear (see below)</li>
85   * <li>two digit week of year, from 01 to 53;</li>
86   * <li>one digit day of week, from 1 to 7 where 1 is Monday and 7 is Sunday;</li>
87   * <li>two digit hour, from 00 to 23;</li>
88   * <li>two digit minute, from 00 to 59;</li>
89   * <li>two digit second, from 00 to 59;</li>
90   * <li>three decimal places for milliseconds, if required;</li>
91   * <li>time zone offset of the form <code>�HH:mm</code> (or '0' if UTC)</li>
92   * </ul>
93   * </p>
94   * <p>
95   * From <a href="http://joda-time.sourceforge.net/cal_iso.html">Joda-Time</a>: Weeks are always complete, and the first week of a
96   * 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
97   * the previous year, and the last week finishes in the next year. The weekyear field is defined to refer to the year that owns
98   * the week, which may differ from the actual year.
99   * </p>
100  */
101 public interface DateTimeFactory extends ValueFactory<DateTime> {
102 
103     /**
104      * Create a date-time instance for the current time in the local time zone.
105      * 
106      * @return the current date-time instance
107      * @see #createUtc()
108      */
109     DateTime create();
110 
111     /**
112      * Create a date-time instance for the current time in UTC.
113      * 
114      * @return the current date-time instance (in UTC)
115      * @see #create()
116      */
117     DateTime createUtc();
118 
119     /**
120      * Create a date-time instance that is offset from the original by the specified amount.
121      * 
122      * @param original
123      * @param offsetInMillis the offset in milliseconds (positive or negative)
124      * @return the offset date-time instance
125      */
126     DateTime create( DateTime original,
127                      long offsetInMillis );
128 
129     /**
130      * Create a date-time instance given the individual values for the fields
131      * 
132      * @param year the year of the era
133      * @param monthOfYear the month of the year
134      * @param dayOfMonth the day of the month
135      * @param hourOfDay the hour of the day
136      * @param minuteOfHour the minute of the hour
137      * @param secondOfMinute the second of the minute
138      * @param millisecondsOfSecond the milliseconds of the second
139      * @return the date-time instance
140      */
141     DateTime create( int year,
142                      int monthOfYear,
143                      int dayOfMonth,
144                      int hourOfDay,
145                      int minuteOfHour,
146                      int secondOfMinute,
147                      int millisecondsOfSecond );
148 
149     /**
150      * Create a date-time instance given the individual values for the fields
151      * 
152      * @param year the year of the era
153      * @param monthOfYear the month of the year
154      * @param dayOfMonth the day of the month
155      * @param hourOfDay the hour of the day
156      * @param minuteOfHour the minute of the hour
157      * @param secondOfMinute the second of the minute
158      * @param millisecondsOfSecond the milliseconds of the second
159      * @param timeZoneOffsetHours the number of hours offset from UTC for the time zone
160      * @return the date-time instance
161      */
162     DateTime create( int year,
163                      int monthOfYear,
164                      int dayOfMonth,
165                      int hourOfDay,
166                      int minuteOfHour,
167                      int secondOfMinute,
168                      int millisecondsOfSecond,
169                      int timeZoneOffsetHours );
170 
171     /**
172      * Create a date-time instance given the individual values for the fields
173      * 
174      * @param year the year of the era
175      * @param monthOfYear the month of the year
176      * @param dayOfMonth the day of the month
177      * @param hourOfDay the hour of the day
178      * @param minuteOfHour the minute of the hour
179      * @param secondOfMinute the second of the minute
180      * @param millisecondsOfSecond the milliseconds of the second
181      * @param timeZoneId the ID of the time zone (e.g, "PST", "UTC", "EDT"); may not be null
182      * @return the date-time instance
183      */
184     DateTime create( int year,
185                      int monthOfYear,
186                      int dayOfMonth,
187                      int hourOfDay,
188                      int minuteOfHour,
189                      int secondOfMinute,
190                      int millisecondsOfSecond,
191                      String timeZoneId );
192 
193 }