Skip to content

Commit

Permalink
fix: 解决在解析ISO8601不带毫秒的数值时,毫秒依然有值的问题。
Browse files Browse the repository at this point in the history
fixed #1884
  • Loading branch information
cnzgray committed May 31, 2018
1 parent 57aff94 commit ba07795
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 31 deletions.
6 changes: 3 additions & 3 deletions src/main/java/com/alibaba/fastjson/parser/JSONScanner.java
Expand Up @@ -510,6 +510,7 @@ private boolean scanISO8601DateIfMatch(boolean strict, int rest) {


char dot = charAt(bp + date_len + 9); char dot = charAt(bp + date_len + 9);
int millisLen = -1; // 有可能没有毫秒区域,没有毫秒区域的时候下一个字符位置有可能是'Z'、'+'、'-' int millisLen = -1; // 有可能没有毫秒区域,没有毫秒区域的时候下一个字符位置有可能是'Z'、'+'、'-'
int millis = 0;
if (dot == '.') { // 0000-00-00T00:00:00.000 if (dot == '.') { // 0000-00-00T00:00:00.000
if (rest < date_len + 11) { if (rest < date_len + 11) {
return false; return false;
Expand All @@ -519,7 +520,7 @@ private boolean scanISO8601DateIfMatch(boolean strict, int rest) {
if (S0 < '0' || S0 > '9') { if (S0 < '0' || S0 > '9') {
return false; return false;
} }
int millis = S0 - '0'; millis = S0 - '0';
millisLen = 1; millisLen = 1;


if (rest > date_len + 11) { if (rest > date_len + 11) {
Expand All @@ -537,9 +538,8 @@ private boolean scanISO8601DateIfMatch(boolean strict, int rest) {
millisLen = 3; millisLen = 3;
} }
} }

calendar.set(Calendar.MILLISECOND, millis);
} }
calendar.set(Calendar.MILLISECOND, millis);


int timzeZoneLength = 0; int timzeZoneLength = 0;
char timeZoneFlag = charAt(bp + date_len + 10 + millisLen); char timeZoneFlag = charAt(bp + date_len + 10 + millisLen);
Expand Down
@@ -0,0 +1,61 @@
package com.alibaba.fastjson.deserializer;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import org.junit.*;

import java.util.*;

/**
* Issue #1884 Test Case
*
* @author cnzgray@qq.com
* @since 2018-05-31 17:15
*/
public class TestISO8601Date {
@Before
public void init() {
JSON.DEFAULT_PARSER_FEATURE |= Feature.AllowISO8601DateFormat.mask;
}

@Test
public void testBug1884() {
Calendar cale = Calendar.getInstance();
cale.clear();
cale.setTimeZone( TimeZone.getTimeZone( "GMT+7" ) );
cale.set( 2018, Calendar.MAY, 31, 19, 13, 42 );
Date date = cale.getTime();

String s1 = "{date: \"2018-05-31T19:13:42+07:00\"}"; // 错误的
String s2 = "{date: \"2018-05-31T19:13:42.000+07:00\"}"; // 正确的
Date date1 = JSON.parseObject( s1, JSONObject.class ).getDate( "date" );
Date date2 = JSON.parseObject( s2, JSONObject.class ).getDate( "date" );
assertEquals(date1, date2);
assertEquals(date, date1);
assertEquals(date, date2);
}

@Test
public void testBug376() {
Calendar cale = Calendar.getInstance();
cale.clear();
cale.setTimeZone( TimeZone.getTimeZone( "GMT" ) );
cale.set( 2018, Calendar.MAY, 31, 19, 13, 42 );
Date date = cale.getTime();

String s1 = "{date: \"2018-05-31T19:13:42Z\"}";
String s2 = "{date: \"2018-05-31T19:13:42.000Z\"}";

Date date1 = JSON.parseObject( s1, JSONObject.class ).getDate( "date" );
Date date2 = JSON.parseObject( s2, JSONObject.class ).getDate( "date" );

assertEquals( date1, date2 );
assertEquals( date, date1 );
assertEquals( date, date2 );
}

private void assertEquals( Date expected, Date actual ) {
Assert.assertEquals( 0, expected.compareTo( actual ) );
}
}

This file was deleted.

0 comments on commit ba07795

Please sign in to comment.