001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.commons.lang.time;
018
019 import java.util.Calendar;
020 import java.util.Date;
021 import java.util.Locale;
022 import java.util.TimeZone;
023
024 /**
025 * <p>Date and time formatting utilities and constants.</p>
026 *
027 * <p>Formatting is performed using the
028 * {@link org.apache.commons.lang.time.FastDateFormat} class.</p>
029 *
030 * @author Apache Software Foundation
031 * @author Apache Ant - DateUtils
032 * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a>
033 * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
034 * @author <a href="mailto:ggregory@seagullsw.com">Gary Gregory</a>
035 * @since 2.0
036 * @version $Id: DateFormatUtils.java 905636 2010-02-02 14:03:32Z niallp $
037 */
038 public class DateFormatUtils {
039
040 /**
041 * ISO8601 formatter for date-time without time zone.
042 * The format used is <tt>yyyy-MM-dd'T'HH:mm:ss</tt>.
043 */
044 public static final FastDateFormat ISO_DATETIME_FORMAT
045 = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss");
046
047 /**
048 * ISO8601 formatter for date-time with time zone.
049 * The format used is <tt>yyyy-MM-dd'T'HH:mm:ssZZ</tt>.
050 */
051 public static final FastDateFormat ISO_DATETIME_TIME_ZONE_FORMAT
052 = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ssZZ");
053
054 /**
055 * ISO8601 formatter for date without time zone.
056 * The format used is <tt>yyyy-MM-dd</tt>.
057 */
058 public static final FastDateFormat ISO_DATE_FORMAT
059 = FastDateFormat.getInstance("yyyy-MM-dd");
060
061 /**
062 * ISO8601-like formatter for date with time zone.
063 * The format used is <tt>yyyy-MM-ddZZ</tt>.
064 * This pattern does not comply with the formal ISO8601 specification
065 * as the standard does not allow a time zone without a time.
066 */
067 public static final FastDateFormat ISO_DATE_TIME_ZONE_FORMAT
068 = FastDateFormat.getInstance("yyyy-MM-ddZZ");
069
070 /**
071 * ISO8601 formatter for time without time zone.
072 * The format used is <tt>'T'HH:mm:ss</tt>.
073 */
074 public static final FastDateFormat ISO_TIME_FORMAT
075 = FastDateFormat.getInstance("'T'HH:mm:ss");
076
077 /**
078 * ISO8601 formatter for time with time zone.
079 * The format used is <tt>'T'HH:mm:ssZZ</tt>.
080 */
081 public static final FastDateFormat ISO_TIME_TIME_ZONE_FORMAT
082 = FastDateFormat.getInstance("'T'HH:mm:ssZZ");
083
084 /**
085 * ISO8601-like formatter for time without time zone.
086 * The format used is <tt>HH:mm:ss</tt>.
087 * This pattern does not comply with the formal ISO8601 specification
088 * as the standard requires the 'T' prefix for times.
089 */
090 public static final FastDateFormat ISO_TIME_NO_T_FORMAT
091 = FastDateFormat.getInstance("HH:mm:ss");
092
093 /**
094 * ISO8601-like formatter for time with time zone.
095 * The format used is <tt>HH:mm:ssZZ</tt>.
096 * This pattern does not comply with the formal ISO8601 specification
097 * as the standard requires the 'T' prefix for times.
098 */
099 public static final FastDateFormat ISO_TIME_NO_T_TIME_ZONE_FORMAT
100 = FastDateFormat.getInstance("HH:mm:ssZZ");
101
102 /**
103 * SMTP (and probably other) date headers.
104 * The format used is <tt>EEE, dd MMM yyyy HH:mm:ss Z</tt> in US locale.
105 */
106 public static final FastDateFormat SMTP_DATETIME_FORMAT
107 = FastDateFormat.getInstance("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
108
109 //-----------------------------------------------------------------------
110 /**
111 * <p>DateFormatUtils instances should NOT be constructed in standard programming.</p>
112 *
113 * <p>This constructor is public to permit tools that require a JavaBean instance
114 * to operate.</p>
115 */
116 public DateFormatUtils() {
117 super();
118 }
119
120 /**
121 * <p>Formats a date/time into a specific pattern using the UTC time zone.</p>
122 *
123 * @param millis the date to format expressed in milliseconds
124 * @param pattern the pattern to use to format the date
125 * @return the formatted date
126 */
127 public static String formatUTC(long millis, String pattern) {
128 return format(new Date(millis), pattern, DateUtils.UTC_TIME_ZONE, null);
129 }
130
131 /**
132 * <p>Formats a date/time into a specific pattern using the UTC time zone.</p>
133 *
134 * @param date the date to format
135 * @param pattern the pattern to use to format the date
136 * @return the formatted date
137 */
138 public static String formatUTC(Date date, String pattern) {
139 return format(date, pattern, DateUtils.UTC_TIME_ZONE, null);
140 }
141
142 /**
143 * <p>Formats a date/time into a specific pattern using the UTC time zone.</p>
144 *
145 * @param millis the date to format expressed in milliseconds
146 * @param pattern the pattern to use to format the date
147 * @param locale the locale to use, may be <code>null</code>
148 * @return the formatted date
149 */
150 public static String formatUTC(long millis, String pattern, Locale locale) {
151 return format(new Date(millis), pattern, DateUtils.UTC_TIME_ZONE, locale);
152 }
153
154 /**
155 * <p>Formats a date/time into a specific pattern using the UTC time zone.</p>
156 *
157 * @param date the date to format
158 * @param pattern the pattern to use to format the date
159 * @param locale the locale to use, may be <code>null</code>
160 * @return the formatted date
161 */
162 public static String formatUTC(Date date, String pattern, Locale locale) {
163 return format(date, pattern, DateUtils.UTC_TIME_ZONE, locale);
164 }
165
166 /**
167 * <p>Formats a date/time into a specific pattern.</p>
168 *
169 * @param millis the date to format expressed in milliseconds
170 * @param pattern the pattern to use to format the date
171 * @return the formatted date
172 */
173 public static String format(long millis, String pattern) {
174 return format(new Date(millis), pattern, null, null);
175 }
176
177 /**
178 * <p>Formats a date/time into a specific pattern.</p>
179 *
180 * @param date the date to format
181 * @param pattern the pattern to use to format the date
182 * @return the formatted date
183 */
184 public static String format(Date date, String pattern) {
185 return format(date, pattern, null, null);
186 }
187
188 /**
189 * <p>Formats a calendar into a specific pattern.</p>
190 *
191 * @param calendar the calendar to format
192 * @param pattern the pattern to use to format the calendar
193 * @return the formatted calendar
194 * @see FastDateFormat#format(Calendar)
195 * @since 2.4
196 */
197 public static String format(Calendar calendar, String pattern) {
198 return format(calendar, pattern, null, null);
199 }
200
201 /**
202 * <p>Formats a date/time into a specific pattern in a time zone.</p>
203 *
204 * @param millis the time expressed in milliseconds
205 * @param pattern the pattern to use to format the date
206 * @param timeZone the time zone to use, may be <code>null</code>
207 * @return the formatted date
208 */
209 public static String format(long millis, String pattern, TimeZone timeZone) {
210 return format(new Date(millis), pattern, timeZone, null);
211 }
212
213 /**
214 * <p>Formats a date/time into a specific pattern in a time zone.</p>
215 *
216 * @param date the date to format
217 * @param pattern the pattern to use to format the date
218 * @param timeZone the time zone to use, may be <code>null</code>
219 * @return the formatted date
220 */
221 public static String format(Date date, String pattern, TimeZone timeZone) {
222 return format(date, pattern, timeZone, null);
223 }
224
225 /**
226 * <p>Formats a calendar into a specific pattern in a time zone.</p>
227 *
228 * @param calendar the calendar to format
229 * @param pattern the pattern to use to format the calendar
230 * @param timeZone the time zone to use, may be <code>null</code>
231 * @return the formatted calendar
232 * @see FastDateFormat#format(Calendar)
233 * @since 2.4
234 */
235 public static String format(Calendar calendar, String pattern, TimeZone timeZone) {
236 return format(calendar, pattern, timeZone, null);
237 }
238
239 /**
240 * <p>Formats a date/time into a specific pattern in a locale.</p>
241 *
242 * @param millis the date to format expressed in milliseconds
243 * @param pattern the pattern to use to format the date
244 * @param locale the locale to use, may be <code>null</code>
245 * @return the formatted date
246 */
247 public static String format(long millis, String pattern, Locale locale) {
248 return format(new Date(millis), pattern, null, locale);
249 }
250
251 /**
252 * <p>Formats a date/time into a specific pattern in a locale.</p>
253 *
254 * @param date the date to format
255 * @param pattern the pattern to use to format the date
256 * @param locale the locale to use, may be <code>null</code>
257 * @return the formatted date
258 */
259 public static String format(Date date, String pattern, Locale locale) {
260 return format(date, pattern, null, locale);
261 }
262
263 /**
264 * <p>Formats a calendar into a specific pattern in a locale.</p>
265 *
266 * @param calendar the calendar to format
267 * @param pattern the pattern to use to format the calendar
268 * @param locale the locale to use, may be <code>null</code>
269 * @return the formatted calendar
270 * @see FastDateFormat#format(Calendar)
271 * @since 2.4
272 */
273 public static String format(Calendar calendar, String pattern, Locale locale) {
274 return format(calendar, pattern, null, locale);
275 }
276
277 /**
278 * <p>Formats a date/time into a specific pattern in a time zone and locale.</p>
279 *
280 * @param millis the date to format expressed in milliseconds
281 * @param pattern the pattern to use to format the date
282 * @param timeZone the time zone to use, may be <code>null</code>
283 * @param locale the locale to use, may be <code>null</code>
284 * @return the formatted date
285 */
286 public static String format(long millis, String pattern, TimeZone timeZone, Locale locale) {
287 return format(new Date(millis), pattern, timeZone, locale);
288 }
289
290 /**
291 * <p>Formats a date/time into a specific pattern in a time zone and locale.</p>
292 *
293 * @param date the date to format
294 * @param pattern the pattern to use to format the date
295 * @param timeZone the time zone to use, may be <code>null</code>
296 * @param locale the locale to use, may be <code>null</code>
297 * @return the formatted date
298 */
299 public static String format(Date date, String pattern, TimeZone timeZone, Locale locale) {
300 FastDateFormat df = FastDateFormat.getInstance(pattern, timeZone, locale);
301 return df.format(date);
302 }
303
304 /**
305 * <p>Formats a calendar into a specific pattern in a time zone and locale.</p>
306 *
307 * @param calendar the calendar to format
308 * @param pattern the pattern to use to format the calendar
309 * @param timeZone the time zone to use, may be <code>null</code>
310 * @param locale the locale to use, may be <code>null</code>
311 * @return the formatted calendar
312 * @see FastDateFormat#format(Calendar)
313 * @since 2.4
314 */
315 public static String format(Calendar calendar, String pattern, TimeZone timeZone, Locale locale) {
316 FastDateFormat df = FastDateFormat.getInstance(pattern, timeZone, locale);
317 return df.format(calendar);
318 }
319
320 }