java.util.Date正在使用1912年之前的日期解析错误的日期
我不明白 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);
日期是 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
谢谢。
回答
时间
永远不要使用遗留类Date。不要浪费你的时间试图了解烂摊子是Date和Calendar。
仅使用现代java.time类。Jackson 的更高版本支持java.time。
OffsetDateTime odt = OffsetDateTime.parse( "1911-01-01T00:00:00+00:00" ) ;
当要求生成表示其值的文本时,会OffsetDateTime生成:
odt.toString(): 1911-01-01T00:00Z
该Z对端装置的一个的零小时-分钟-秒UTC的偏移量,并且被读作“祖鲁”。
有关使用遗留类的代码发生了什么的解释,请参阅Ole VV的优秀回答但请注意,在java.time中使用设计合理的类避免了潜在问题:应用没有被调用的时区。
时区是特定地区人民使用的偏移量的过去、现在和未来变化的历史记录。您的输入带有偏移量(零),没有时区指示。因此在处理您的输入时无需涉及时区。