29
29
* Convert between a date and a String
30
30
*/
31
31
public 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
+
32
38
// SimpleDateFormats are not thread safe. A thread local is being
33
39
// 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
+ };
36
46
37
47
/**
38
48
* Convert a date to a String ("YYYYMMDD")
@@ -41,16 +51,29 @@ public class UtcDateOnlyConverter extends AbstractDateTimeConverter {
41
51
* @return the formatted date
42
52
*/
43
53
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
+ }
45
61
}
46
62
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 );
52
76
}
53
- return converter .dateFormat ;
54
77
}
55
78
56
79
/**
@@ -66,7 +89,7 @@ public static Date convert(String value) throws FieldConvertError {
66
89
assertLength (value , 8 , type );
67
90
assertDigitSequence (value , 0 , 8 , type );
68
91
try {
69
- d = getFormatter () .parse (value );
92
+ d = utcDateConverter . get (). dateFormat .parse (value );
70
93
} catch (ParseException e ) {
71
94
throwFieldConvertError (value , type );
72
95
}
0 commit comments