Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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 Jackson@JsonFormat转换日期时时区不正确_Java_Spring_Date_Jackson_Annotations - Fatal编程技术网

Java Jackson@JsonFormat转换日期时时区不正确

Java Jackson@JsonFormat转换日期时时区不正确,java,spring,date,jackson,annotations,Java,Spring,Date,Jackson,Annotations,我从JSON负载中得到一个值,如下所示: "callStartTime" : "2019-03-27 13:00:00" Entity.java @JsonProperty("callStartTime") @Column(name = "call_start_dt", nullable = false) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", lenient = OptBoolean.FALSE) private Date callStart

我从JSON负载中得到一个值,如下所示:

"callStartTime" : "2019-03-27 13:00:00"
Entity.java

@JsonProperty("callStartTime")
@Column(name = "call_start_dt", nullable = false)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", lenient = OptBoolean.FALSE)
private Date callStartTime;
当我在控制台上打印时,它说:

Wed Mar 27 08:00:00 CDT 2019
我希望与json负载中的一样。我怎么能修好它

我只是从json中提取日期,并将其写入一个datetime列中的mysql db

试试这个

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
private Date callStartTime;
不捕获时区数据。它只知道自大纪元以来的毫秒数

您可以尝试使用中的一个模块,并将其反序列化到的实例中,该实例是时区感知的

编辑:尝试将此作为使其工作的基础:

public class SoTest {
    public static void main(String[] args) throws Exception {
        ObjectMapper om = new ObjectMapper().registerModule(new ParameterNamesModule())
                                            .registerModule(new JavaTimeModule());

        String s = "{\"callStartTime\" : \"2019-03-27T13:00:00Z\" }";

        MyType mt = om.readValue(s, MyType.class);

        System.out.println(mt.getCallStartTime());
    }
}

class MyType {
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssX", lenient = OptBoolean.FALSE)
    private ZonedDateTime callStartTime;

    public ZonedDateTime getCallStartTime() {
        return callStartTime;
    }

    public void setCallStartTime(ZonedDateTime date) {
        this.callStartTime = date;
    }

}

简单解决方案:我通过将数据类型更改为
String
解决了这个问题,这就完成了我捕获来自JSON负载的值的目标。使用
Date
和其他数据类型将值转换为不同的时区

@JsonProperty("callStartTime")
@Column(name = "call_start_dt", nullable = false)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", lenient = OptBoolean.FALSE)
private **String** callStartTime;

有两种可能的解决方案:

1。定义ObjectMapper bean并设置日期格式。

@Bean
public ObjectMapper objectMapper()
{
   ObjectMapper objectMapper = new ObjectMapper();

   DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   objectMapper.setDateFormat(df);
       return objectMapper;
}
2。使用@JsonFormat设置特定字段的日期格式

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", lenient = OptBoolean.FALSE)
private Date createTime;

它抛出异常<代码>异常为com.fasterxml.jackson.databind.exc.InvalidFormatException:无法从字符串“2019-03-27T13:00:00Z”反序列化类型为java.util.Date`的值:预期格式为“yyyy-MM-dd'T'HH:MM:ss.SSSXXX”`啊,您的日期中没有毫秒,请使用yyyy-MM-dd'HH:MM:ss.xxxi如果您使用java版本>=1.8,请使用ZonedDateTime而不是date@JsonFormat(shape=JsonFormat.shape.STRING,pattern=“yyy-MM-dd'HH:MM:ss.XXX”)私有ZonedDateTime调用StartTime;但它仍然抛出了一个异常。和上面提到的一样,看看这个问题:有一个例外<代码>无法从字符串“2019-03-27T13:00:00Z”反序列化java.time.ZonedDateTime类型的值:无法解析文本“2019-03-27T13:00:00Z”,在索引19处找到未解析的文本;嵌套异常为com.fasterxml.jackson.databind.exc.InvalidFormatException:无法从字符串“2019-03-27T13:00:00Z”中反序列化java.time.ZonedDateTime类型的值:无法解析文本“2019-03-27T13:00:00Z”,在索引19中找到的未解析文本还添加了“我不使用ObjectMapper”中提到的所有3个依赖项。如何注册?我只是从json中提取日期,并将其写入datetime列中的mysql db中。您使用@JsonProperty()表明某个地方正在使用Jackson进行json解析,这反过来意味着正在使用ObjectMapper。好的,明白了。但还是有例外。我如何解决它?