java.util.Date 正在使用 1912 年之前的日期解析错误的日期

Lui*_*sao 1 java parsing json date

我不明白 Jackson 库在 1912 年之前解析错误日期的原因。我想问题是java.util.Date 转换,因为 Gson 仍然存在问题。

这是我的代码:

ObjectMapper mapper = new ObjectMapper();
String tmp = "{\"date\":\"1911-01-01T00:00:00+00:00\"}";
        
Response resp = mapper.readValue(tmp, Response.class);
System.out.println("Date->"+resp.date);
Run Code Online (Sandbox Code Playgroud)

日期是 java.util.Date 类型的字段

如您所见,输入是: 1911-01-01T00:00:00+00:00

输出是:(Sun Jan 01 00:09:21 CET 1911我不明白为什么要设置那个时间)

但是如果我设置这个输入: 1912-01-01T00:00:00+00:00

输出是正确的: Mon Jan 01 00:00:00 CET 1912

仅发生在 1912 年之前的日期。

JDK v1.8.0_101

谢谢。

Bas*_*que 6

时间

永远不要使用遗留类Date。不要浪费你的时间试图了解烂摊子是DateCalendar

仅使用现代java.time类。Jackson 的更高版本支持java.time

OffsetDateTime odt = OffsetDateTime.parse( "1911-01-01T00:00:00+00:00" ) ;
Run Code Online (Sandbox Code Playgroud)

当要求生成表示其值的文本时,会OffsetDateTime生成:

odt.toString(): 1911-01-01T00:00Z

Z对端装置的一个的零小时-分钟-秒UTC的偏移量,并且被读作“祖鲁”。


有关使用遗留类的代码发生了什么的解释,请参阅Ole VV优秀回答但请注意,在java.time中使用设计合理的类避免了潜在问题:应用没有被调用的时区。

时区是特定地区人民使用的偏移量的过去、现在和未来变化的历史记录。您的输入带有偏移量(零),没有时区指示。因此在处理您的输入时无需涉及时区。