Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带SpringBoot的时区_Java_Spring Boot - Fatal编程技术网

Java 带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

我使用SpringBoot并尝试将此返回转换为我的对象

...
{
      "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:美国/圣保罗]