知識庫 / Java Dates RSS 訂閱

使用日期參數在 Spring 中進行操作

Java Dates,Spring MVC
HongKong
6
01:36 PM · Dec 06 ,2025

1. 引言

在本簡短教程中,我們將學習如何在 Spring REST 請求中接受 <em >Date</em>, <em >LocalDate</em><em >LocalDateTime</em> 參數,無論是在請求級別還是應用程序級別。

2. 問題描述

假設我們有一個控制器,它包含三個方法,這些方法接受 DateLocalDateLocalDateTime 參數。

@RestController
public class DateTimeController {

    @PostMapping("/date")
    public void date(@RequestParam("date") Date date) {
        // ...
    }

    @PostMapping("/localdate")
    public void localDate(@RequestParam("localDate") LocalDate localDate) {
        // ...
    }

    @PostMapping("/localdatetime")
    public void dateTime(@RequestParam("localDateTime") LocalDateTime localDateTime) {
        // ...
    }
}

向任何使用符合 ISO 8601 格式的參數的 POST 請求發送請求時,我們會收到異常。

例如,將“2018-10-22”發送到 date 端點時,我們會收到一個錯誤請求,錯誤信息類似於以下內容:

Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; 
  nested exception is org.springframework.core.convert.ConversionFailedException.

之所以出現這種情況,是因為 Spring 默認情況下無法將 String 參數轉換為任何日期或時間對象。

3. 在請求級別轉換日期參數

一種處理此問題的辦法是使用 @DateTimeFormat 註解標記參數,並提供格式化模式參數:

@RestController
public class DateTimeController {

    @PostMapping("/date")
    public void date(@RequestParam("date") 
      @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date date) {
        // ...
    }

    @PostMapping("/local-date")
    public void localDate(@RequestParam("localDate") 
      @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate localDate) {
        // ...
    }

    @PostMapping("/local-date-time")
    public void dateTime(@RequestParam("localDateTime") 
      @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime localDateTime) {
        // ...
    }
}

這樣字符串才能被正確地轉換為日期對象,前提是字符串使用 ISO 8601 格式進行格式化。

我們還可以通過在 @DateTimeFormat 註解中提供模式參數來使用自定義的轉換模式:

@PostMapping("/date")
public void date(@RequestParam("date") 
  @DateTimeFormat(pattern = "dd.MM.yyyy") Date date) {
    // ...
}

4. 在應用程序級別轉換日期參數

另一種處理 Spring 中日期和時間對象轉換的方法是提供全局配置。 按照 官方文檔 的建議,應擴展 WebMvcConfigurationSupport 配置及其 mvcConversionService 方法:

@Configuration
public class DateTimeConfig extends WebMvcConfigurationSupport {

    @Bean
    @Override
    public FormattingConversionService mvcConversionService() {
        DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(false);

        DateTimeFormatterRegistrar dateTimeRegistrar = new DateTimeFormatterRegistrar();
        dateTimeRegistrar.setDateFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy"));
        dateTimeRegistrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
        dateTimeRegistrar.registerFormatters(conversionService);

        DateFormatterRegistrar dateRegistrar = new DateFormatterRegistrar();
        dateRegistrar.setFormatter(new DateFormatter("dd.MM.yyyy"));
        dateRegistrar.registerFormatters(conversionService);

        return conversionService;
    }
}

首先,我們創建 DefaultFormattingConversionService,並設置參數為 false,這意味着 Spring 將不會默認註冊任何格式化器。

然後,我們需要註冊自定義的日期和日期時間參數格式,我們通過註冊兩個自定義格式化註冊器來實現。第一個註冊器,DateTimeFormatterRegistar,將負責解析 LocalDateLocaDateTime 對象。第二個註冊器,DateFormattingRegistrar,將處理 Date 對象。

5. 在 Properties 文件中配置日期時間

Spring 也允許我們通過應用程序的 properties 文件來設置全局日期時間格式。 針對日期、日期時間以及時間格式,有三個單獨的參數。

spring.mvc.format.date=yyyy-MM-dd
spring.mvc.format.date-time=yyyy-MM-dd HH:mm:ss
spring.mvc.format.time=HH:mm:ss

所有這些參數都可以用 iso 值替換。例如,將日期時間參數設置為:

spring.mvc.format.date-time=iso

將等於 ISO-8601 格式:

spring.mvc.format.date-time=yyyy-MM-dd HH:mm:ss

6. 結論

在本文中,我們學習瞭如何在 Spring MVC 請求中接受日期參數。我們討論了按請求和全局的方式進行此操作。

我們還學習瞭如何創建自定義的日期格式化模式。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.