【问题标题】:Why LocalDate format changed when I transform entity to Json?当我将实体转换为 Json 时,为什么 LocalDate 格式会发生变化?
【发布时间】:2019-07-17 09:26:29
【问题描述】:

我的目标是将日期存储到数据库中。为了做这个应用程序,我使用 Springboot、JPA、H2、...

我使用LocalDate,希望的格式是yyyy-MM-dd

实体

@Entity
public class MyObject {

    @Id
    private String id;
    private LocalDate startdate;
    private LocalDate enddate;

    public MyObject() {}

    public MyObject(LocalDate enddate) {
        this.startdate = LocalDate.now();
        this.enddate = enddate;
    }

    ...
}

主要

private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
MyObject myObject = new MyObject(LocalDate.parse("2019-03-01", formatter));
myObject.setId(UUID.randomUUID().toString());
myObjectResource.save(myObject);

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
System.out.println(myObject.getStartdate()); // 2019-02-23
System.out.println(myObject.getEnddate()); // 2019-03-01
HttpEntity<String> entity = new HttpEntity<>(this.toJsonString(myObject), headers);
System.out.println(entity.toString()); // <{"id":"ba6649e4-6e65-4f54-8f1a-f8fc7143b05a","startdate":{"year":2019,"month":"FEBRUARY","dayOfMonth":23,"dayOfWeek":"SATURDAY","era":"CE","dayOfYear":54,"leapYear":false,"monthValue":2,"chronology":{"id":"ISO","calendarType":"iso8601"}},"enddate":{"year":2019,"month":"MARCH","dayOfMonth":1,"dayOfWeek":"FRIDAY","era":"CE","dayOfYear":60,"leapYear":false,"monthValue":3,"chronology":{"id":"ISO","calendarType":"iso8601"}}},[Content-Type:"application/json"]>

private String toJsonString(Object o) throws Exception {
    ObjectMapper om = new ObjectMapper();
    return om.writeValueAsString(o);
}

您能帮我理解为什么entity.toString() 中的日期与之前getMethods() 中的日期不同吗?

感谢您的帮助!

【问题讨论】:

  • 因为杰克逊不知道如何格式化和解析 LocalDate ,除非您添加一个模块来这样做。 github.com/FasterXML/jackson-modules-java8/tree/master/datetime
  • 一种选择是您可以将日期作为字符串存储在数据库中,但是这样您将失去对日期执行操作的能力。但是,您必须将日期转换回 localDate 对象才能执行这些操作。

标签: java localdate httpentity


【解决方案1】:

LocalDate.parse 返回一个新的LocalDate 对象。 DateTimeFormatter 中指定的格式选项在后面会丢失。

Jackson(您正在使用的 JSON 库)不知道您之前如何“格式化”LocalDate,因此它使用自己的格式。

您可以注册JavaTimeModule

final ObjectMapper om = new ObjectMapper();
om.registerModule(new JavaTimeModule());

或者您可以提供您的自定义JsonSerializer&lt;T&gt;

【讨论】:

  • 这么用LocalDate不是很好的选择吗?使用Date 是不是更好?
  • @N.Lamblin 继续使用新的 Java 8 API(不应再次使用日期),但请选择我上面提供的替代方案之一。
  • 不,一点也不。日期基本上已被弃用。两者都没有格式。日期只是毫秒数。一个 LocalDate 我只是一年、一个月和一天。 选择在将字符串解析为日期或本地日期以及将本地日期或日期转换为字符串时使用哪种格式。
  • @LppEdd 非常感谢!然而,Jackson 文档建议使用 com.fasterxml.jackson.datatype.jsr310.JavaTimeModule,因为不推荐使用 JSR310Module()
猜你喜欢
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多