Although RFC 3339 says that "Applications [...] may choose, for the sake of readability, to specify a full-date and full-time separated by (say) a space character", the standard is to use T as a separator.
And if I'm already nagging, ISO and RFC are two different things, as are ISO-8601 and RFC 3339, so don't use ISO in the name and RFC in the comments as if they're interchangeable, pick one and stick with it. While the RFC allows space as the separator, ISO-8601 actually requires T as the date-time separator. On 11/20/2016 05:19 AM, [email protected] wrote: > Author: cbrisson > Date: Sun Nov 20 10:19:41 2016 > New Revision: 1770547 > > URL: http://svn.apache.org/viewvc?rev=1770547&view=rev > Log: > [tools] introduce 'iso' (date/time with time zone, locale independent) and > 'intl' (date/time without time zone, locale and time zone independent) formats > > Modified: > > velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/ConversionUtils.java > > velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/DateTool.java > > Modified: > velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/ConversionUtils.java > URL: > http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/ConversionUtils.java?rev=1770547&r1=1770546&r2=1770547&view=diff > ============================================================================== > --- > velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/ConversionUtils.java > (original) > +++ > velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/ConversionUtils.java > Sun Nov 20 10:19:41 2016 > @@ -30,7 +30,9 @@ import java.text.SimpleDateFormat; > import java.util.Collection; > import java.util.Date; > import java.util.Calendar; > +import java.util.HashMap; > import java.util.Locale; > +import java.util.Map; > import java.util.TimeZone; > import java.util.concurrent.ConcurrentMap; > import java.util.concurrent.ConcurrentHashMap; > @@ -52,6 +54,18 @@ public class ConversionUtils > //NOTE: '3' belongs to a non-public "scientific" style > private static final int STYLE_INTEGER = 4; > > + /* Java DateFormat standard constants extensions */ > + private static final int STYLE_INTL = 5; /* international format without > time zone*/ > + private static final int STYLE_ISO = 6; /* international format with > timezone (RFC 3339) */ > + > + > + /* iso/intl date/time formats (locale-independant) */ > + private static DateFormat isoDateFormat = new > SimpleDateFormat("yyyy-MM-dd"); /* date for iso/intl */ > + private static DateFormat intlTimeFormat = new > SimpleDateFormat("HH:mm:ss"); /* time without timezone */ > + private static DateFormat isoTimeFormat = new > SimpleDateFormat("HH:mm:ssXXX"); /* time with ISO 8601 timezone */ > + private static DateFormat intlTimestampFormat = new > SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /* timestamp without timezone */ > + private static DateFormat isoTimestampFormat = new > SimpleDateFormat("yyyy-MM-dd HH:mm:ssXXX"); /* timestamp with ISO 88601 > timezone */ > + > // cache custom formats > private static ConcurrentMap<String,NumberFormat> customFormatsCache = > new ConcurrentHashMap<String,NumberFormat>(); > > @@ -401,19 +415,53 @@ public class ConversionUtils > else if (timeStyle < 0) > { > // only a date style was specified > - df = DateFormat.getDateInstance(dateStyle, locale); > + switch (dateStyle) > + { > + case STYLE_INTL: > + case STYLE_ISO: > + df = isoDateFormat; > + break; > + default: > + df = DateFormat.getDateInstance(dateStyle, locale); > + df.setTimeZone(timezone); > + break; > + } > } > else if (dateStyle < 0) > { > // only a time style was specified > - df = DateFormat.getTimeInstance(timeStyle, locale); > + switch (timeStyle) > + { > + case STYLE_INTL: > + df = intlTimeFormat; > + break; > + case STYLE_ISO: > + df = (DateFormat) isoTimeFormat.clone(); > + df.setTimeZone(timezone); > + break; > + default: > + df = DateFormat.getTimeInstance(timeStyle, locale); > + df.setTimeZone(timezone); > + break; > + } > } > else > { > - df = DateFormat.getDateTimeInstance(dateStyle, timeStyle, > - locale); > + switch (dateStyle) > + { > + case STYLE_INTL: > + df = intlTimestampFormat; > + break; > + case STYLE_ISO: > + df = (DateFormat) isoTimestampFormat.clone(); > + df.setTimeZone(timezone); > + break; > + default: > + df = DateFormat.getDateTimeInstance(dateStyle, > timeStyle, locale); > + df.setTimeZone(timezone); > + break; > + } > } > - df.setTimeZone(timezone); > return df; > } > catch (Exception suppressed) > @@ -423,6 +471,19 @@ public class ConversionUtils > } > } > > + static Map<String, Integer> stylesMap; > + static > + { > + stylesMap = new HashMap<String, Integer>(); > + stylesMap.put("FULL", DateFormat.FULL); > + stylesMap.put("LONG", DateFormat.LONG); > + stylesMap.put("MEDIUM", DateFormat.MEDIUM); > + stylesMap.put("SHORT", DateFormat.SHORT); > + stylesMap.put("DEFAULT", DateFormat.DEFAULT); > + stylesMap.put("INTL", STYLE_INTL); > + stylesMap.put("ISO", STYLE_ISO); > + } > + > /** > * Checks a string to see if it matches one of the standard DateFormat > * style patterns: full, long, medium, short, or default. If it does, > @@ -435,32 +496,8 @@ public class ConversionUtils > */ > public static int getDateStyleAsInt(String style) > { > - // avoid needlessly running through all the string comparisons > - if (style == null || style.length() < 4 || style.length() > 7) { > - return -1; > - } > - if (style.equalsIgnoreCase("full")) > - { > - return DateFormat.FULL; > - } > - if (style.equalsIgnoreCase("long")) > - { > - return DateFormat.LONG; > - } > - if (style.equalsIgnoreCase("medium")) > - { > - return DateFormat.MEDIUM; > - } > - if (style.equalsIgnoreCase("short")) > - { > - return DateFormat.SHORT; > - } > - if (style.equalsIgnoreCase("default")) > - { > - return DateFormat.DEFAULT; > - } > - // ok, it's not any of the standard patterns > - return -1; > + Integer intStyle = stylesMap.get(style.toUpperCase()); > + return intStyle == null ? -1 : intStyle.intValue(); > } > > > > Modified: > velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/DateTool.java > URL: > http://svn.apache.org/viewvc/velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/DateTool.java?rev=1770547&r1=1770546&r2=1770547&view=diff > ============================================================================== > --- > velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/DateTool.java > (original) > +++ > velocity/tools/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/DateTool.java > Sun Nov 20 10:19:41 2016 > @@ -28,16 +28,22 @@ import java.util.Calendar; > import java.util.Locale; > import java.util.TimeZone; > import org.apache.velocity.tools.ConversionUtils; > -import org.apache.velocity.tools.ToolContext; > import org.apache.velocity.tools.config.DefaultKey; > > /** > - * Tool for working with {@link Date} and {@link Calendar} > + * <p>Tool for working with {@link Date} and {@link Calendar} > * in Velocity templates. It is useful for accessing and > * formatting the "current" date as well as for formatting > * arbitrary {@link Date} and {@link Calendar} objects. Also > * the tool can be used to retrieve {@link DateFormat} instances > - * or make conversions to and from various date types. > + * or make conversions to and from various date types.</p> > + * <p>Possible formats include: > + * <ul> > + * <li>'short', 'medium', 'long', 'full' (from {@link > java.text.DateFormat}, optionally suffixed by '_time' or '_date' to get a > specific time or date format</li> > + * <li>'intl' for RFC 3339 without time zone (locale and time-zone > independent), optionally suffixed by '_time' or '_date' to get a specific > time or date format</li> > + * <li>'iso' for RFC 3339 with time zone (locale independent), > optionally suffixed by '_time' or '_date' to get a specific time or date > format</li> > + * <li>a custom format, as specified in {@link SimpleDateFormat}</li> > + * </ul></p> > * <p><pre> > * Example of formatting the "current" date: > * $date -> Oct 19, 2003 9:54:50 PM > @@ -46,6 +52,7 @@ import org.apache.velocity.tools.config. > * $date.full_date -> Sunday, October 19, 2003 > * $date.get('default','short') -> Oct 19, 2003 9:54 PM > * $date.get('yyyy-M-d H:m:s') -> 2003-10-19 21:54:50 > + * $date.iso -> 2003-10-19 21:54:50-07:00 > * > * Example of formatting an arbitrary date: > * $myDate -> Tue Oct 07 03:14:50 PDT 2003 > @@ -77,7 +84,7 @@ public class DateTool extends FormatConf > */ > public static final String TIMEZONE_KEY = "timezone"; > > - private TimeZone timezone = TimeZone.getDefault(); > + private TimeZone timezone = TimeZone.getDefault(); > > /** > * Does the actual configuration. This is protected, so > @@ -567,7 +574,7 @@ public class DateTool extends FormatConf > * @param locale the {@link Locale} to be used > * @param timezone the {@link TimeZone} to be used > * @return an instance of {@link DateFormat} > - * @see #getDateFormat(int timeStyle, int dateStyle, Locale locale, > TimeZone timezone) > + * @see {@link DateFormat#getDateFormat(int timeStyle, int dateStyle, > Locale locale, TimeZone timezone)} > * @since VelocityTools 1.1 > */ > public DateFormat getDateFormat(String dateStyle, String timeStyle, > > -- Sergiu Dumitriu http://purl.org/net/sergiu/ --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
