Java 带SpringBoot的时区
我使用SpringBoot并尝试将此返回转换为我的对象Java 带SpringBoot的时区,java,spring-boot,Java,Spring Boot,我使用SpringBoot并尝试将此返回转换为我的对象 ... { "data": "2015-05-29", "codigo": 618393, "apresentante": null, "total": 6, "desconto": 0, "pago": 6 }, ... 所以我有一个目标 private Date data; 我有一个简单的格式: SimpleDateFormat sdf = new Si
...
{
"data": "2015-05-29",
"codigo": 618393,
"apresentante": null,
"total": 6,
"desconto": 0,
"pago": 6
},
...
所以我有一个目标
private Date data;
我有一个简单的格式:
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
System.out.println(sdf.format(myObjet.getData()));
和打印
2015年5月28日,但正确的日期是2015年5月29日
my application.properties包含以下行:
spring.jackson.date-format=yyyy-MM-dd
spring.jackson.time-zone=America/Sao_Paulo
有人知道为什么会这样吗?
tks首先,您怀疑Jackson配置干扰了
SimpleDateFormat
解析/格式化,但这是错误的:尽管Jackson使用SimpleDateFormat
解析/格式化代码,spring.jackson.*
的配置不会影响您在应用程序中创建的每个SimpleDataFormat
实例。它们是两个独立的东西
必须使用对象映射器
和@Autowired
,才能使用某些上下文配置;尽管我怀疑,正如我所观察到的,spring.jackson.timezone
config不会影响json/Date的解析/格式化结果,也就是说,jackson内部没有在序列化/反序列化中使用此值。
我的结论是,当我们设置@JsonFormat(timezone=“xxx”)
时,无论是spring.jackson.timezone
还是mapper.setTimezone()
都不会影响(反)序列化中的时区转换处理;后者似乎凌驾于前两者之上;并且,应用程序的默认时区将是转换时的“目标”时区
我建议您附加另一个简短但完整的测试用例,以显示哪些是有效的,哪些是无效的
检查我的这个测试,并尝试发布一个完整的测试,如下所示:
@Test
public void testSimpleDateFormat() throws Exception {
System.out.println("The default timezone is: " + TimeZone.getDefault().getDisplayName());
SimpleDateFormat f = new SimpleDateFormat("yyyy/MM/dd");
String ds = "2015/05/29";
Date d = f.parse(ds);
System.out.println(d);
}
请确保从简单的测试开始,一点一点地向其中添加更多变量。格式化之前的data.getTime()是什么?当我调试日期时,日期是2015-05-28(也是错误的)默认时区是什么?如果您希望格式化的日期与JSON中的日期相同,那么您应该使用Jackson解析它时使用的时区对其进行格式化。jvm的时区是什么?您可以打印sdf.getTimeZone()com.ibm.icu.impl。OlsonTimeZone@2d282381[transitionCount=130,typeCount=3,TransitionTime=[-1767214412,-1206957600,-1191362400,-1175374800,-1159826400,-6338196008,0,-10800,0,-108003600],typeMapData=[1,2,1,2,1,2,1,2,1,2,1,2,1,2,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,1,2,最后一个学年=2039年,最后一个学年=2.1774528E12年,最后一个学期=SimpleTimeZone:美国/圣保罗]