从@RequestBody获取LocalDate,将其转换为dd/mm/yyyy格式,再转换回LocalDate并存储在数据库中

问题描述 投票:0回答:1

我正在创建一个 Rest API 应用程序来跟踪用户的费用。我有 LocalDate 类型的日期变量,默认格式是 yyyy-mm-dd 但我想将 dd/mm/yyyy 存储在数据库中

我尝试的是从RequestBody获取localDate,将其格式化为dd/mm/yyyy(返回字符串)并将其转换回LocalDate。但是,日期仍以默认格式 yyyy-mm-dd 存储。我认为问题出在 LocalDate.parse(dateString, formatter);因为它会转换回默认格式或忽略新格式。不确定,但这是我的假设 这是我的代码:

@PostMapping()
    public ResponseEntity<Expense> addExpense(@RequestBody @Valid Expense expense) {
        
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy", Locale.UK);

        LocalDate date = expense.getDate();

        String dateString = date.format(formatter);

        LocalDate formattedDate = LocalDate.parse(dateString, formatter);
        
        expense.setDate(formattedDate); 

我不知道是否有办法在请求中接受 dd/mm/yyyy 格式的输入,而不是 yyyy-mm-dd

mongodb spring-boot rest localdate
1个回答
0
投票

这里的问题是 LocalDate 对象默认总是使用“yyyy-MM-dd”格式进行存储和解析。

如果您想将日期以“dd/MM/yyyy”格式存储在数据库中,则需要在存储之前将日期转换为字符串。但是,通常建议在数据库中以标准“yyyy-MM-dd”格式存储日期,以便在处理与日期相关的操作时保持一致性和简单性。

您可以使用自定义反序列化器自定义请求中 LocalDate 对象的反序列化。


public class CustomLocalDateDeserializer extends JsonDeserializer<LocalDate> {

    @Override
    public LocalDate deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
            throws IOException, JsonProcessingException {
        String date = jsonParser.getText();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        try {
            return LocalDate.parse(date, formatter);
        } catch (DateTimeParseException e) {
            throw new RuntimeException(e);
        }
    }
}

这是您的 DTO 请求:


public class Expense {
    
    @JsonDeserialize(using = CustomLocalDateDeserializer.class)
    private LocalDate date;

    // other fields, getters and setters
}

这样你就可以得到你想要的本地日期了。

© www.soinside.com 2019 - 2024. All rights reserved.