version:1.2.47 com.alibaba.fastjson.util.TypeUtils.castToDate(Object value, String format)
如果时间字符串是'20181011103607186+0800' 因为不包含'-' 所以即使设置 JSON.DEFFAULT_DATE_FORMAT="yyyyMMddHHmmssSSSZ"; 也不能正常解析,如果是西经的时区,例如'20181011103607186-0800',就能正常解析
version:1.2.47 com.alibaba.fastjson.util.TypeUtils.castToDate(Object value, String format)
如果时间字符串是'20181011103607186+0800' 因为不包含'-' 所以即使设置 JSON.DEFFAULT_DATE_FORMAT="yyyyMMddHHmmssSSSZ"; 也不能正常解析,如果是西经的时区,例如'20181011103607186-0800',就能正常解析
问题没重现
可能描述的有点问题,而且开头截图的应该是我之前看到class文件,现在重新描述一下 我现在遇到的问题是,json数据里的时间是string类型,格式是yyyyMMddHHmmssSSSZ 用fastjson反序列化失败. fastsjon的版本:1.2.8 自己调试后,在com.alibaba.fastjson.util.TypeUtils的castToDate(Object value) 方法中看到如下代码(275行): `if (value instanceof String) { String strVal = (String) value;
if (strVal.indexOf('-') != -1) {
String format;
if (strVal.length() == JSON.DEFFAULT_DATE_FORMAT.length()) {
format = JSON.DEFFAULT_DATE_FORMAT;
} else if (strVal.length() == 10) {
format = "yyyy-MM-dd";
} else if (strVal.length() == "yyyy-MM-dd HH:mm:ss".length()) {
format = "yyyy-MM-dd HH:mm:ss";
} else {
format = "yyyy-MM-dd HH:mm:ss.SSS";
}
SimpleDateFormat dateFormat = new SimpleDateFormat(format);
try {
return (Date) dateFormat.parse(strVal);
} catch (ParseException e) {
throw new JSONException("can not cast to Date, value : " + strVal);
}
}
if (strVal.length() == 0) {
return null;
}
longValue = Long.parseLong(strVal);
}`
如果是字符串反序列化成Date,首先会判断是否包含"-" 但是这种带时区的时间字符串,东半球的时间是"20181011103607186+0800"不包含"-",因此直接使用Long.parseLong(strVal)去换装,一定是没法转的.而西半球的时间虽然包含"-" 但是"20181011103607186-0800"和"yyyyMMddHHmmssSSSZ"长度并不相等,即使设置JSON.DEFFAULT_DATE_FORMAT="yyyyMMddHHmmssSSSZ" 也不能正常换装.
现在重新看了源码,好像就是不支持这种格式的时间反序列化?我当初看的class文件不知道为什么看到了对size=22和yyyyMMddHHmmssSSSZ这种格式的特殊处理(1楼截图第三行),所以以为是个bug.
用FastJSON解析阿里API返回的数据 日期也是转换失败的 20181229162849000+0800