无法反序列化字符串“Aug 29, 2023 5:48:51 PM”中 java.util.Date 类型的值:预期格式“yyyy-MM-dd HH:mm:ss。SSS”

Can not deserialize value of type java.util.Date from String "Aug 29, 2023 5:48:51 PM": expected format "yyyy-MM-dd HH:mm:ss.SSS"

提问人:PersonuNique 提问时间:9/4/2023 最后编辑:Arvind Kumar AvinashPersonuNique 更新时间:9/5/2023 访问量:164

问:

我正在尝试将此数据“2023 年 8 月 29 日下午 5:48:51”解析为 JSON,但出现以下错误

无法反序列化字符串“Aug 29, 2023 5:48:51 PM”中 java.util.Date 类型的值:预期格式“yyyy-MM-dd HH:mm:ss。SSS”

相应字段的 POJO 声明如下:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss.SSS")
    @Column(name = "createdOn")
    private Date createdOn;

请帮忙

我试图将该字段的 pojo 声明修改为此

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss.SSS")
@Column(name = "createdOn")
private Date createdOn;
Java JSON 时间 序列化 日期格式

评论

1赞 Basil Bourque 9/5/2023
提示:请告知数据发布者,不要对日期时间值仅使用标准 ISO 8601 格式。
1赞 Anonymous 9/5/2023
不应使用 .这个类总是设计得很差,正是因为这个原因,十年前被 java.time 取代了,java.time 是现代的 Java datre 和 time API。也许是适合您的用例的类型。DateLocalDateTme

答:

3赞 Arvind Kumar Avinash 9/5/2023 #1

java.time

日期时间 API 及其相应的解析/格式化类型已过时且容易出错。2014 年 3 月,新式日期时间 API 取代了旧版日期时间 API。从那时起,强烈建议切换到 ,即现代日期时间 API。java.utilSimpleDateFormatjava.time

与日期时间字符串对应的格式位于区域设置中。MMM dd, uuuu h:m:s aen_US

演示:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

class Main {
    public static void main(String[] args) {
        DateTimeFormatter parser = DateTimeFormatter.ofPattern("MMM dd, uuuu h:m:s a", new Locale("en_US"));
        System.out.println(LocalDateTime.parse("Aug 29, 2023 5:48:51 PM", parser));
    }
}

输出:

2023-08-29T17:48:51

在线演示

根据此说明,可以在代码中进行以下更改:

@JsonFormat(pattern = "MMM dd, uuuu h:m:s a", shape = JsonFormat.Shape.STRING, locale = "en_US")
@Column(name = "createdOn")
private LocalDateTime createdOn;

从 Trail 了解新式日期时间 API:日期时间

评论

1赞 PersonuNique 9/5/2023
谢谢阿维纳什,这真的帮助了我。