2929 * Convert between a date and a String
3030 */
3131public class UtcDateOnlyConverter extends AbstractDateTimeConverter {
32+
33+ protected static final class Context {
34+ private final DateFormat dateFormat = createDateFormat ("yyyyMMdd" );
35+ private final StringBuffer buffer = new StringBuffer (128 );
36+ }
37+
3238 // SimpleDateFormats are not thread safe. A thread local is being
3339 // used to maintain high concurrency among multiple session threads
34- private static final ThreadLocal <UtcDateOnlyConverter > utcDateConverter = new ThreadLocal <UtcDateOnlyConverter >();
35- private final DateFormat dateFormat = createDateFormat ("yyyyMMdd" );
40+ private static final ThreadLocal <Context > utcDateConverter = new ThreadLocal <Context >() {
41+ @ Override
42+ protected Context initialValue () {
43+ return new Context ();
44+ }
45+ };
3646
3747 /**
3848 * Convert a date to a String ("YYYYMMDD")
@@ -41,16 +51,29 @@ public class UtcDateOnlyConverter extends AbstractDateTimeConverter {
4151 * @return the formatted date
4252 */
4353 public static String convert (Date d ) {
44- return getFormatter ().format (d );
54+ Context context = utcDateConverter .get ();
55+ try {
56+ context .dateFormat .format (d , context .buffer , DontCareFieldPosition .INSTANCE );
57+ return context .buffer .toString ();
58+ } finally {
59+ context .buffer .setLength (0 );
60+ }
4561 }
4662
47- private static DateFormat getFormatter () {
48- UtcDateOnlyConverter converter = utcDateConverter .get ();
49- if (converter == null ) {
50- converter = new UtcDateOnlyConverter ();
51- utcDateConverter .set (converter );
63+ /**
64+ * Convert a date to a String ("YYYYMMDD")
65+ *
66+ * @param d the date to convert
67+ * @param stringBuilder the out buffer to hold formatted date
68+ */
69+ public static void convert (Date d , StringBuilder stringBuilder ) {
70+ Context context = utcDateConverter .get ();
71+ try {
72+ context .dateFormat .format (d , context .buffer , DontCareFieldPosition .INSTANCE );
73+ stringBuilder .append (context .buffer );
74+ } finally {
75+ context .buffer .setLength (0 );
5276 }
53- return converter .dateFormat ;
5477 }
5578
5679 /**
@@ -66,7 +89,7 @@ public static Date convert(String value) throws FieldConvertError {
6689 assertLength (value , 8 , type );
6790 assertDigitSequence (value , 0 , 8 , type );
6891 try {
69- d = getFormatter () .parse (value );
92+ d = utcDateConverter . get (). dateFormat .parse (value );
7093 } catch (ParseException e ) {
7194 throwFieldConvertError (value , type );
7295 }
0 commit comments