From a5fee4cf03d6150196f4376936b507e811c406fe Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 16 Aug 2017 19:57:02 +0800 Subject: [PATCH] improved date parse support. for issue #1411 --- .../alibaba/fastjson/parser/JSONScanner.java | 17 ++++++++++++----- .../alibaba/json/bvt/date/DateFieldTest10.java | 18 ++++++++++++++++++ .../alibaba/json/bvt/issue_1200/Issue1298.java | 12 ++++++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/alibaba/fastjson/parser/JSONScanner.java b/src/main/java/com/alibaba/fastjson/parser/JSONScanner.java index 79d4a22d96..bcd3607ec3 100644 --- a/src/main/java/com/alibaba/fastjson/parser/JSONScanner.java +++ b/src/main/java/com/alibaba/fastjson/parser/JSONScanner.java @@ -241,7 +241,11 @@ public boolean scanISO8601DateIfMatch(boolean strict) { } } - if (rest == 8 || rest == 14 || (rest == 17 && charAt(bp + 6) != '-')) { + char c10; + if (rest == 8 + || rest == 14 + || (rest == 16 && ((c10 = charAt(bp + 10)) == 'T' || c10 == ' ')) + || (rest == 17 && charAt(bp + 6) != '-')) { if (strict) { return false; } @@ -258,8 +262,10 @@ public boolean scanISO8601DateIfMatch(boolean strict) { char c7 = charAt(bp + 7); char c8 = charAt(bp + 8); - final boolean sperate17 = c4 == '-' && c7 == '-' && rest == 17; - if (sperate17) { + final boolean c_47 = c4 == '-' && c7 == '-'; + final boolean sperate16 = c_47 && rest == 16; + final boolean sperate17 = c_47 && rest == 17; + if (sperate17 || sperate16) { y0 = c0; y1 = c1; y2 = c2; @@ -289,14 +295,15 @@ public boolean scanISO8601DateIfMatch(boolean strict) { int hour, minute, seconds, millis; if (rest != 8) { char c9 = charAt(bp + 9); - char c10 = charAt(bp + 10); + c10 = charAt(bp + 10); char c11 = charAt(bp + 11); char c12 = charAt(bp + 12); char c13 = charAt(bp + 13); char h0, h1, m0, m1, s0, s1; - if (sperate17 && c10 == 'T' && c13 == ':' && charAt(bp + 16) == 'Z') { + if ((sperate17 && c10 == 'T' && c13 == ':' && charAt(bp + 16) == 'Z') + || (sperate16 && (c10 == ' ' || c10 == 'T') && c13 == ':')) { h0 = c11; h1 = c12; m0 = charAt(bp + 14); diff --git a/src/test/java/com/alibaba/json/bvt/date/DateFieldTest10.java b/src/test/java/com/alibaba/json/bvt/date/DateFieldTest10.java index 034107063b..3e318fe334 100644 --- a/src/test/java/com/alibaba/json/bvt/date/DateFieldTest10.java +++ b/src/test/java/com/alibaba/json/bvt/date/DateFieldTest10.java @@ -33,6 +33,24 @@ public void test_2() throws Exception { assertEquals(object, model.date); } + public void test_3() throws Exception { + String text = "{\"date\":\"2017-08-16 04:29\"}"; + Model model = JSON.parseObject(text, Model.class); + + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + Object object = format.parse("2017-08-16 04:29"); + assertEquals(object, model.date); + } + + public void test_4() throws Exception { + String text = "{\"date\":\"2017-08-16T04:29\"}"; + Model model = JSON.parseObject(text, Model.class); + + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + Object object = format.parse("2017-08-16 04:29"); + assertEquals(object, model.date); + } + public static class Model { public Date date; } diff --git a/src/test/java/com/alibaba/json/bvt/issue_1200/Issue1298.java b/src/test/java/com/alibaba/json/bvt/issue_1200/Issue1298.java index 5a77b9a865..94a32f7f53 100644 --- a/src/test/java/com/alibaba/json/bvt/issue_1200/Issue1298.java +++ b/src/test/java/com/alibaba/json/bvt/issue_1200/Issue1298.java @@ -20,4 +20,16 @@ public void test_for_issue() throws Exception { assertEquals("\"2017-06-29T10:36:30+08:00\"", JSON.toJSONString(date, SerializerFeature.UseISO8601DateFormat)); } + + public void test_for_issue_1() throws Exception { + JSONObject object = new JSONObject(); + + object.put("date", "2017-08-15 20:00:00.000"); + + Date date = object.getObject("date", java.util.Date.class); + + assertEquals("\"2017-08-15T20:00:00+08:00\"", JSON.toJSONString(date, SerializerFeature.UseISO8601DateFormat)); + + JSON.parseObject("\"2017-08-15 20:00:00.000\"", java.util.Date.class); + } }