All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.restlet.util.InternetDateFormat Maven / Gradle / Ivy

Go to download

This OSGi bundle wraps org.restlet, and com.noelios.restlet ${pkgVersion} jar files.

The newest version!
/**
 * Copyright 2005-2009 Noelios Technologies.
 * 
 * The contents of this file are subject to the terms of one of the following
 * open source licenses: LGPL 3.0 or LGPL 2.1 or CDDL 1.0 or EPL 1.0 (the
 * "Licenses"). You can select the license that you prefer but you may not use
 * this file except in compliance with one of these Licenses.
 * 
 * You can obtain a copy of the LGPL 3.0 license at
 * http://www.opensource.org/licenses/lgpl-3.0.html
 * 
 * You can obtain a copy of the LGPL 2.1 license at
 * http://www.opensource.org/licenses/lgpl-2.1.php
 * 
 * You can obtain a copy of the CDDL 1.0 license at
 * http://www.opensource.org/licenses/cddl1.php
 * 
 * You can obtain a copy of the EPL 1.0 license at
 * http://www.opensource.org/licenses/eclipse-1.0.php
 * 
 * See the Licenses for the specific language governing permissions and
 * limitations under the Licenses.
 * 
 * Alternatively, you can obtain a royalty free commercial license with less
 * limitations, transferable or non-transferable, directly at
 * http://www.noelios.com/products/restlet-engine
 * 
 * Restlet is a registered trademark of Noelios Technologies.
 */

package org.restlet.util;

import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.FieldPosition;
import java.text.ParseException;
import java.text.ParsePosition;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.SimpleTimeZone;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * This class handles Internet date/time strings in accordance with RFC 3339. It
 * provides static methods to convert from various Java constructs (long, Date,
 * and Calendar) to RFC 3339 format strings and to parse these strings back into
 * the same Java constructs.
 * 

* In addition to the static utility methods, this class also wraps a Calendar * object allowing this class to be used as a value object in place of a Java * construct. *

* Strings are parsed in accordance with the RFC 3339 format: * *

 * YYYY-MM-DD(T|t|\s)hh:mm:ss[.ddd][tzd]
 * 
* * The tzd represents the time zone designator and is either an * upper or lower case 'Z' indicating UTC or a signed hh:mm offset. * * @author Frank Hellwig ([email protected]) */ public class InternetDateFormat extends DateFormat { private static volatile DecimalFormat df2 = new DecimalFormat("00"); private static volatile DecimalFormat df4 = new DecimalFormat("0000"); /** The Regex pattern to match. */ private static volatile Pattern pattern; private static final long serialVersionUID = 1L; /** * A time zone with zero offset and no DST. */ public static final TimeZone UTC = new SimpleTimeZone(0, "Z"); static { String reDate = "(\\d{4})-(\\d{2})-(\\d{2})"; String reTime = "(\\d{2}):(\\d{2}):(\\d{2})(\\.\\d+)?"; String reZone = "(?:([zZ])|(?:(\\+|\\-)(\\d{2}):(\\d{2})))"; String re = reDate + "[tT\\s]" + reTime + reZone; pattern = Pattern.compile(re); } /** * Returns the current date and time as an RFC 3339 date/time string using * the UTC (Z) time zone. * * @return an RFC 3339 date/time string (does not include milliseconds) */ public static String now() { return now(UTC); } /** * Returns the current date and time as an RFC 3339 date/time string using * the specified time zone. * * @param zone * the time zone to use * @return an RFC 3339 date/time string (does not include milliseconds) */ public static String now(TimeZone zone) { return toString(System.currentTimeMillis(), zone); } /** * Our private parse utility that parses the string, clears the calendar, * and then sets the fields. * * @param s * the string to parse * @param cal * the calendar object to populate * @throws IllegalArgumentException * if the string is not a valid RFC 3339 date/time string */ private static void parse(String s, Calendar cal) { Matcher m = pattern.matcher(s); if (!m.matches()) { throw new IllegalArgumentException("Invalid date/time: " + s); } cal.clear(); cal.set(Calendar.YEAR, Integer.parseInt(m.group(1))); cal.set(Calendar.MONTH, Integer.parseInt(m.group(2)) - 1); cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(m.group(3))); cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(m.group(4))); cal.set(Calendar.MINUTE, Integer.parseInt(m.group(5))); cal.set(Calendar.SECOND, Integer.parseInt(m.group(6))); if (m.group(7) != null) { float fraction = Float.parseFloat(m.group(7)); cal.set(Calendar.MILLISECOND, (int) (fraction * 1000F)); } if (m.group(8) != null) { cal.setTimeZone(new SimpleTimeZone(0, "Z")); } else { int sign = m.group(9).equals("-") ? -1 : 1; int tzhour; tzhour = Integer.parseInt(m.group(10)); int tzminute = Integer.parseInt(m.group(11)); int offset = sign * ((tzhour * 60) + tzminute); String id = Integer.toString(offset); cal.setTimeZone(new SimpleTimeZone(offset * 60000, id)); } } /** * Parses an RFC 3339 date/time string to a Calendar object. * * @param s * the string to parse * @return the Calendar object * @throws IllegalArgumentException * if the string is not a valid RFC 3339 date/time string */ public static Calendar parseCalendar(String s) { Calendar cal = new GregorianCalendar(); parse(s, cal); return cal; } /** * Parses an RFC 3339 date/time string to a Date object. * * @param s * the string to parse * @return the Date object * @throws IllegalArgumentException * if the string is not a valid RFC 3339 date/time string */ public static Date parseDate(String s) { Calendar cal = new GregorianCalendar(); parse(s, cal); return cal.getTime(); } /** * Parses an RFC 3339 date/time string to a millisecond time value. * * @param s * the string to parse * @return the millisecond time value * @throws IllegalArgumentException * if the string is not a valid RFC 3339 date/time string */ public static long parseTime(String s) { Calendar cal = new GregorianCalendar(); parse(s, cal); return cal.getTimeInMillis(); } /** * Converts the specified Calendar object to an RFC 3339 date/time string. * Unlike the toString methods for Date and long, no additional variant of * this method taking a time zone is provided since the time zone is built * into the Calendar object. * * @param cal * the Calendar object * @return an RFC 3339 date/time string (does not include milliseconds) */ public static String toString(Calendar cal) { StringBuilder buf = new StringBuilder(); buf.append(df4.format(cal.get(Calendar.YEAR))); buf.append("-"); buf.append(df2.format(cal.get(Calendar.MONTH) + 1)); buf.append("-"); buf.append(df2.format(cal.get(Calendar.DAY_OF_MONTH))); buf.append("T"); buf.append(df2.format(cal.get(Calendar.HOUR_OF_DAY))); buf.append(":"); buf.append(df2.format(cal.get(Calendar.MINUTE))); buf.append(":"); buf.append(df2.format(cal.get(Calendar.SECOND))); int ms = cal.get(Calendar.MILLISECOND); if (ms != 0) { buf.append(".").append((int) (ms / 10F)); } int tzminute = (cal.get(Calendar.ZONE_OFFSET) + cal .get(Calendar.DST_OFFSET)) / 60000; if (tzminute == 0) { buf.append("Z"); } else { if (tzminute < 0) { tzminute = -tzminute; buf.append("-"); } else { buf.append("+"); } int tzhour = tzminute / 60; tzminute -= tzhour * 60; buf.append(df2.format(tzhour)); buf.append(":"); buf.append(df2.format(tzminute)); } return buf.toString(); } /** * Converts the specified Date object to an RFC 3339 date/time string using * the UTC (Z) time zone. * * @param date * the Date object * @return an RFC 3339 date/time string (does not include milliseconds) */ public static String toString(Date date) { return toString(date, UTC); } /** * Converts the specified Date object to an RFC 3339 date/time string using * the specified time zone. * * @param date * the Date object * @param zone * the time zone to use * @return an RFC 3339 date/time string (does not include milliseconds) */ public static String toString(Date date, TimeZone zone) { InternetDateFormat dt = new InternetDateFormat(date, zone); return dt.toString(); } /** * Converts the specified millisecond time value to an RFC 3339 date/time * string using the UTC (Z) time zone. * * @param time * the millisecond time value * @return an RFC 3339 date/time string (does not include milliseconds) */ public static String toString(long time) { return toString(time, UTC); } /** * Converts the specified millisecond time value to an RFC 3339 date/time * string using the specified time zone. * * @param time * the millisecond time value * @param zone * the time zone to use * @return an RFC 3339 date/time string (does not include milliseconds) */ public static String toString(long time, TimeZone zone) { InternetDateFormat dt = new InternetDateFormat(time, zone); return dt.toString(); } /** * Creates a new InternetDateFormat object from the specified Date object * using the UTC (Z) time zone. * * @param date * the Date object * @return the InternetDateFormat object */ public static InternetDateFormat valueOf(Date date) { return new InternetDateFormat(date); } /** * Creates a new InternetDateFormat object from the specified Date object * using the specified time zone. * * @param date * the Date object * @param zone * the time zone to use * @return the InternetDateFormat object */ public static InternetDateFormat valueOf(Date date, TimeZone zone) { return new InternetDateFormat(date, zone); } /** * Creates a new InternetDateFormat object from the specified millisecond * time value using the UTC (Z) time zone. * * @param time * the millisecond time value * @return the InternetDateFormat object */ public static InternetDateFormat valueOf(long time) { return new InternetDateFormat(time); } /** * Creates a new InternetDateFormat object from the specified millisecond * time value using the specified time zone. * * @param time * the millisecond time value * @param zone * the time zone to use * @return the InternetDateFormat object */ public static InternetDateFormat valueOf(long time, TimeZone zone) { return new InternetDateFormat(time, zone); } /** * Creates a new InternetDateFormat object by parsing an RFC 3339 date/time * string. * * @param s * the string to parse * @return the InternetDateFormat object * @throws IllegalArgumentException * if the string is not a valid RFC 3339 date/time string */ public static InternetDateFormat valueOf(String s) { return new InternetDateFormat(s); } /** * The Calendar object that allows this class to act as a value holder. */ private Calendar cal; /** * Creates a new InternetDateFormat object set to the current time using the * UTC (Z) time zone. */ public InternetDateFormat() { this(UTC); } /** * Creates a new InternetDateFormat object initialized from a Calendar * object. The specified calendar object is cloned thereby isolating this * InternetDateFormat object from any changes made to the specified calendar * object after calling this constructor. * * @param cal * the Calendar object */ public InternetDateFormat(Calendar cal) { this.cal = (Calendar) cal.clone(); } /** * Creates a new InternetDateFormat object initialized from a Date object * using the UTC (Z) time zone. * * @param date * the Date object */ public InternetDateFormat(Date date) { this(date, UTC); } /** * Creates a new InternetDateFormat object initialized from a Date object * using the specified time zone. * * @param date * the Date object * @param zone * the time zone to use */ public InternetDateFormat(Date date, TimeZone zone) { cal = new GregorianCalendar(zone); cal.setTime(date); } /** * Creates a new InternetDateFormat object initialized from a millisecond * time value using the UTC (Z) time zone. * * @param time * the millisecond time value */ public InternetDateFormat(long time) { this(time, UTC); } /** * Creates a new InternetDateFormat object initialized from a millisecond * time value using the specified time zone. * * @param time * the millisecond time value * @param zone * the time zone to use */ public InternetDateFormat(long time, TimeZone zone) { cal = new GregorianCalendar(zone); cal.setTimeInMillis(time); } /** * Creates a new InternetDateFormat object by parsing an RFC 3339 date/time * string. * * @param s * the string to parse * @throws IllegalArgumentException * if the string is not a valid RFC 3339 date/time string */ public InternetDateFormat(String s) { cal = parseCalendar(s); } /** * Creates a new InternetDateFormat object set to the current time using the * specified time zone. * * @param zone * the time zone to use */ public InternetDateFormat(TimeZone zone) { cal = new GregorianCalendar(zone); } @Override public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) { return toAppendTo.append(valueOf(date)); } /** * Gets the Calendar object wrapped by this InternetDateFormat object. * * @return the cloned Calendar object */ public Calendar getCalendar() { return (Calendar) cal.clone(); } /** * Gets the value of this InternetDateFormat object as a Date object. * * @return the Date object */ public Date getDate() { return cal.getTime(); } /** * Gets the value of this InternetDateFormat object as millisecond time * value. * * @return the millisecond time value */ public long getTime() { return cal.getTimeInMillis(); } @Override public Date parse(String source) throws ParseException { return parse(source, (ParsePosition) null); } @Override public Date parse(String source, ParsePosition pos) { return parseDate(source); } /** * Converts this InternetDateFormat object to an RFC 3339 date/time string. * * @return an RFC 3339 date/time string (does not include milliseconds) */ public String toString() { return toString(cal); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy