Java解析老式日期报错:无法反序列化1901年日期值
解决Java解析带秒级时区偏移的日期字符串问题
你的日期字符串1901-01-01T00:20:40.000+02:20:40解析失败的核心原因不是“老式日期”,而是时区偏移部分包含了秒数(+02:20:40)——Java传统的java.util.Date及配套解析工具默认不支持这种带秒的时区格式,而你之前处理的近20年日期时区偏移都是±HH:mm格式,所以能正常解析。
下面是两种可行的解决办法:
方案一:改用Java 8+新日期API(推荐)
Java 8引入的java.time包完全支持带秒级时区偏移的ISO 8601格式,步骤如下:
- 修改实体类字段类型:
import java.time.OffsetDateTime; public class Record extends Docs { public OffsetDateTime published; }
- 确保Jackson版本≥2.6(RestAssured默认依赖的Jackson版本通常满足),若使用旧版本,需添加
jackson-datatype-jsr310依赖(Maven示例):
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>对应Jackson版本号</version> </dependency>
修改后RestAssured会自动完成解析,无需额外配置。
方案二:自定义Jackson日期格式(兼容旧Date类型)
如果必须保留java.util.Date类型,可通过Jackson注解或全局配置支持带秒的时区格式:
方式1:字段级注解配置
在published字段上添加@JsonFormat注解指定格式:
import com.fasterxml.jackson.annotation.JsonFormat; import java.util.Date; public class Record extends Docs { @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX") public Date published; }
其中XXX格式符支持包含秒数的ISO时区偏移格式。
方式2:全局Jackson配置
通过RestAssured的全局配置统一设置日期解析格式:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import java.text.SimpleDateFormat; import io.restassured.config.RestAssuredConfig; import io.restassured.config.ObjectMapperConfig; // 自定义ObjectMapper ObjectMapper customMapper = new ObjectMapper(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); customMapper.setDateFormat(dateFormat); customMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // 配置RestAssured使用自定义Mapper RestAssuredConfig config = RestAssured.config() .objectMapperConfig(new ObjectMapperConfig() .jackson2ObjectMapperFactory((cls, charset) -> customMapper));
将上述config传入你的请求代码即可生效。
额外提示
优先选择Java 8+的java.time API,它是官方推荐的日期处理方案,相比java.util.Date更安全、API设计更清晰,还能避免旧API的线程安全问题。
内容的提问来源于stack exchange,提问作者Noy M
相关产品推荐
相关产品推荐

