我正在尝试为 Jackson 对象映射器设置自定义日期格式(我正在使用 Jackson-databind-2.8.x),以便它可以解析传入的数据特定格式的 JSON 日期。没有秒部分的日期格式工作正常,但是当我向其中添加秒时;看来失败了。
有效的格式
日期格式:yyyy-MM-dd HH:mmZ
正确解析的日期示例:2019-09-01 15:00+0000
为对象映射器设置日期格式:
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mmZ"));
格式无效
日期格式:yyyy-MM-dd HH:mm:ssZ
示例日期:2019-09-01 15:00:00+0000
为对象映射器设置日期格式:
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ"));
异常:
Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException:
Can not deserialize value of type java.util.Date from String "2019-09-01 15:00:00+0000": not a valid representation (error: Failed to parse Date value '2019-09-01 15:00:00+0000': Unparseable date: "2019-09-01 15:00:00+0000")
我已经验证上面是一个正确的简单日期格式,因为下面的代码工作正常:
import java.text.SimpleDateFormat;
public class TestDF {
public static void main(String[] args) throws Exception {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
String date = "2019-09-01 15:00:00+0000";
System.out.println(format.parse(date));
}
}
最佳答案
您应该更仔细地查看您的代码:
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mmZ"));
对比
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
这是两种不同的格式。
应该是:
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ"));
注意添加:ss
这确实是给定字符串的格式。
编辑
此测试有效(使用 Jackson 2.8.0)
public class FormatTest {
@Test
public void testFormat() throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
String date = "2019-09-01 15:00:00+0000";
Date parse = sdf.parse(date);
String json = "{\"date\" : \"" + date + "\"}";
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setDateFormat(sdf);
ClassWithDate cwd = objectMapper.readValue(json, ClassWithDate.class);
Assert.assertEquals(parse, cwd.date);
}
private static class ClassWithDate {
public Date date;
}
}
关于java - Jackson ObjectMapper 不接受所有日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57347663/