我正在创建一个 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
这里的问题是 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
}
这样你就可以得到你想要的本地日期了。