小编典典

Spring Boot中的JSON Java 8 LocalDateTime格式

java

我在Spring Boot应用程序中格式化Java 8 LocalDateTime时遇到一个小问题。对于“正常”日期,我没有问题,但是LocalDateTime字段转换为以下内容:

"startDate" : {
    "year" : 2010,
    "month" : "JANUARY",
    "dayOfMonth" : 1,
    "dayOfWeek" : "FRIDAY",
    "dayOfYear" : 1,
    "monthValue" : 1,
    "hour" : 2,
    "minute" : 2,
    "second" : 0,
    "nano" : 0,
    "chronology" : {
      "id" : "ISO",
      "calendarType" : "iso8601"
    }
  }

虽然我想将其转换为:

"startDate": "2019-01-01"

我的代码如下所示:

@JsonFormat(pattern="yyyy-MM-dd")
@DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
public LocalDateTime getStartDate() {
    return startDate;
}

但是以上任何一个注释都无法正常工作,日期的格式仍然像上面一样。建议欢迎!


阅读 684

收藏
2020-03-14

共1个答案

小编典典

(这是在Spring Boot 2.x之前执行此操作的方式,这对于使用较旧版本的Spring Boot的人员可能有用)

我终于在这里找到了如何做。要修复它,我需要另一个依赖项:

compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.4.0")

通过包括这种依赖关系,Spring会自动注册一个转换器,它作为描述在这里。之后,你需要将以下内容添加到application.properties:

spring.jackson.serialization.write_dates_as_timestamps=false

这将确保使用正确的转换器,并且日期将以以下格式打印 2019-03-16T13:56:39.492

仅在要更改日期格式的情况下才需要注释。

更新:

Java 8和Spring Boot的一个常见问题是,用JSON格式化Java 8日期并不是最简单的方法。这包括诸如LocalDate,LocalDateTime和LocalTime之类的类。但是,在较新版本的Spring Boot中,此问题已得到修复,对于许多开发人员来说,似乎仍然未知。在本博文中,我将展示一个小示例应用程序,该应用程序有望在Spring Boot应用程序中帮助格式化Java 8日期。

首先,让我们进入start.spring.io并创建一个启动项目。我选择了一个基于Gradle,Java和Spring Boot 2.1.2的项目,但是如果你更喜欢Maven,那也可以。输入组和工件名称,然后在依赖项中选择“ web”。单击生成按钮,你的项目应下载。

如何实现Java 8日期时间格式?
要继续,请在你喜欢的IDE中打开下载的项目,然后添加以下代码:

@RestController
public class DateTimeController {

    private Clock clock = Clock.fixed(Instant.parse("2019-02-05T16:45:42.01Z"), ZoneId.of("Australia/Sydney"));

    @GetMapping("/time")
    public DateTimeDto timeMapping() {
        return new DateTimeDto(clock);
    }
}

public class DateTimeDto {

    private LocalDate localDate;
    private LocalDateTime localDateTime;
    private LocalTime localTime;

    public DateTimeDto(Clock clock) {
        localDate = LocalDate.now(clock);
        localDateTime = LocalDateTime.now(clock);
        localTime = LocalTime.now(clock);
    }

    public LocalDate getLocalDate() {
        return localDate;
    }

    public LocalDateTime getLocalDateTime() {
        return localDateTime;
    }

    public LocalTime getLocalTime() {
        return localTime;
    }
}

有关完整源代码,请参见GitHub项目。现在,当访问http:// localhost:8080 / time时,以下代码将产生类似于以下输出的输出:

{
  "localDate": "2019-02-05",
  "localDateTime": "2019-02-05T22:08:28.097832",
  "localTime": "22:08:28.097869"
}

如何测试Java 8日期时间格式?
为了以更结构化的方式测试上述内容,可以使用MockMvc对此代码编写单元测试:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
class DateTimeControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void timeMapping() throws Exception {
        this.mockMvc.perform(get("/time"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(content().json("{'localDate':'2019-02-06'}"))
                .andExpect(content().json("{'localDateTime':'2019-02-06T03:45:42.01'}"))
                .andExpect(content().json("{'localTime':'03:45:42.01'}"));
    }
}

为了更好地控制日期和时间的格式,可以使用@JsonFormat批注,如下所示:

@Override
@JsonFormat(pattern="dd-MM-yyyy")
public LocalDate getLocalDate() {
    return super.getLocalDate();
}

我希望以上内容有助于在Spring Boot 2应用程序中格式化Java 8日期和时间,请查看GitHub项目以获取完整示例。

2020-03-14