From b538000715ab827087aa3cfcd26ccf03b049bac5 Mon Sep 17 00:00:00 2001 From: Patrick Simon Date: Tue, 4 Feb 2020 13:24:50 -0800 Subject: [PATCH] Add millisecond format to date parsing --- src/main/java/com/box/sdk/BoxDateFormat.java | 23 +++++++++++++++++--- src/test/java/com/box/sdk/MetadataTest.java | 14 +++++++++--- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/box/sdk/BoxDateFormat.java b/src/main/java/com/box/sdk/BoxDateFormat.java index 1403bfe35..b75551b59 100644 --- a/src/main/java/com/box/sdk/BoxDateFormat.java +++ b/src/main/java/com/box/sdk/BoxDateFormat.java @@ -10,7 +10,7 @@ * Contains methods for parsing and formatting dates for use with the Box API. */ public final class BoxDateFormat { - private static final ThreadLocal THREAD_LOCAL_DATE_FORMAT = new ThreadLocal() { + private static final ThreadLocal THREAD_LOCAL_DATE_FORMAT_SECONDS = new ThreadLocal() { @Override protected DateFormat initialValue() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); @@ -19,6 +19,15 @@ protected DateFormat initialValue() { } }; + private static final ThreadLocal THREAD_LOCAL_DATE_FORMAT_MILLISECONDS = new ThreadLocal() { + @Override + protected DateFormat initialValue() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX"); + sdf.setTimeZone(TimeZone.getTimeZone("UTC")); + return sdf; + } + }; + private BoxDateFormat() { } /** @@ -28,7 +37,15 @@ private BoxDateFormat() { } * @throws ParseException if the string cannot be parsed into a valid date. */ public static Date parse(String dateString) throws ParseException { - return THREAD_LOCAL_DATE_FORMAT.get().parse(dateString); + try { + return THREAD_LOCAL_DATE_FORMAT_SECONDS.get().parse(dateString); + } catch (ParseException pe) { + try { + return THREAD_LOCAL_DATE_FORMAT_MILLISECONDS.get().parse(dateString); + } catch (ParseException pe2) { + throw pe2; + } + } } /** @@ -37,7 +54,7 @@ public static Date parse(String dateString) throws ParseException { * @return a string containing the formatted date. */ public static String format(Date date) { - return THREAD_LOCAL_DATE_FORMAT.get().format(date); + return THREAD_LOCAL_DATE_FORMAT_SECONDS.get().format(date); } } diff --git a/src/test/java/com/box/sdk/MetadataTest.java b/src/test/java/com/box/sdk/MetadataTest.java index 540241149..47ee5e061 100644 --- a/src/test/java/com/box/sdk/MetadataTest.java +++ b/src/test/java/com/box/sdk/MetadataTest.java @@ -296,7 +296,15 @@ public void testMultiSelectMetadataCRUD() { @Test @Category(UnitTest.class) - public void getValues() { + public void testGetValues() { + // Run test with various Date formats. + this.getValues("\"2017-10-10T22:10:00-08:00\"", 1507702200000L); + this.getValues("\"2017-10-10T22:10:00.000-08:00\"", 1507702200000L); + this.getValues("\"2017-10-10T22:10:00.123-08:00\"", 1507702200123L); + this.getValues("\"2017-10-10T22:10:00.100-08:00\"", 1507702200100L); + } + + public void getValues(String dateString, Long dateLong) { final String stringValue = "Q1 plans"; final int intValue = 123456; @@ -304,14 +312,14 @@ public void getValues() { arrayValue[0] = "internal"; arrayValue[1] = "internalEng"; Date dateValue = new Date(); - dateValue.setTime(1507702200000L); + dateValue.setTime(dateLong); String json = "{\n" + " \"audiences\": [\"internal\", \"internalEng\"],\n" + " \"documentType\": \"" + stringValue + "\",\n" + " \"competitiveDocument\": \"no\",\n" + " \"status\": \"active\",\n" - + " \"deadline\": \"2017-10-10T22:10:00-08:00\",\n" + + " \"deadline\": " + dateString + ",\n" + " \"capacity\": " + intValue + ",\n" + " \"currentState\": \"proposal\",\n" + " \"$type\": \"marketingCollateral-d086c908-2498-4d3e-8a1f-01e82bfc2abe\",\n"