Jackson日期解析在某些机器上失败



我使用Jackson来解析JSON,由于定义为:

的日期字段,反序列化失败。
@JsonProperty("jcr:created")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "EEE MMM dd yyyy HH:mm:ss 'GMT'Z")
private Date created;

com.fasterxml.jackson.databind.exc。InvalidFormatException:不能从字符串"中反序列化类型为java.util.Date的值2016年15:37:40 GMT+0200预期格式EEE MMM dd yyyy HH:mm:ss"GMT 'Z"

JSON内容如下所示:

jcr:created"; "Thu Feb 04 2016 09:32:14 GMT+0100">

图案有什么问题?

java.time

java.util日期时间API及其对应的解析/格式化类型SimpleDateFormat过时且容易出错。2014年3月,现代Date-Time API作为Java 8标准库的一部分发布。它取代了旧的日期时间API,从那时起,强烈建议切换到java.time,现代日期时间API。

同样,在没有指定Locale的情况下绝不使用日期时间解析/格式化API.

使用java.time

解决方案由于日期-时间字符串有时区信息,因此应该将其写入ZonedDateTime

@JsonProperty("jcr:created")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "EEE MMM dd yyyy HH:mm:ss VVXX", locale = Locale.ENGLISH)
private ZonedDateTime created;

演示:

class Main {
public static void main(String[] args) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMM dd yyyy HH:mm:ss VVXX", Locale.ENGLISH);
String created = "Thu Feb 04 2016 09:32:14 GMT+0100";
ZonedDateTime zdt = ZonedDateTime.parse(created, dtf);
System.out.println(zdt);
}
}

:

2016-02-04T08:32:14Z[GMT]
<<p>

在线演示/kbd>从Trail: Date Time了解更多关于现代Date-Time API的信息.

如果出于任何原因,您希望继续使用容易出错的旧API,只需在注释

中包含locale
@JsonProperty("jcr:created")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "EEE MMM dd yyyy HH:mm:ss 'GMT'Z", locale = Locale.ENGLISH)
private Date created;

:

class Main {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss 'GMT'Z", Locale.ENGLISH);
String created = "Thu Feb 04 2016 09:32:14 GMT+0100";
Date date = sdf.parse(created);
System.out.println(date);
}
}

:

Thu Feb 04 08:32:14 GMT 2016
<<p>在线演示/kbd>

相关内容

最新更新