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,