在我的Spring Boot应用程序中,我需要处理带有日期时间字段的表单并将其转换为Java中的LocalDateTime
。
我指定了模式"YYYY-MM-dd HH:mm"
,当我提交带有输入值1990-01-01 10:10
的表单时,转换失败。
这是表单对象:
public class UserForm {
@NotNull
@DateTimeFormat(pattern = "YYYY-MM-dd HH:mm")
private LocalDateTime dateTime;
// getters, setters
}
控制器:
@RequestMapping("/users")
@Controller
public class UserController {
@GetMapping("")
public String userForm(UserForm userForm) {
return "/users/form";
}
@PostMapping("")
public String postForm(@Valid UserForm userForm, BindingResult bindingResult) {
System.out.println(userForm + " " + bindingResult);
return "/users/form";
}
}
和Thymeleaf形式:
<form th:object="${userForm}" th:action="@{/users}" method="post">
<span th:each="err: ${#fields.errors('dateTime')}" th:text="${err}" style="background-color:red;color:white;"/>
<input type="text" th:field="*{dateTime}"/>
<input type="submit">
</form>
此示例出了什么问题?我应该如何修复它以使其正确地将String
解析为LocalDateTime
?
我还提交了example application here。
更新:
在“转换失败”下,我是说我得到了例外:
org.springframework.core.convert.ConversionFailedException:无法从[java.lang.String]类型转换为[@ javax.validation.constraints.NotNull @ org.springframework.format.annotation.DateTimeFormat java.time。 [LocalDateTime]的值1990-01-01 10:10
使用小写yyyy
解决了该问题。谢谢。
答案 0 :(得分:2)
格式设置应为uuuu-MM-dd HH:mm
。
LocalDateTime.parse(
"1990-01-01 10:10" ,
DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm" )
)
大写的YYYY
表示基于星期的年份,而不是日历年。
更仔细地研究类文档,以格式化模式代码。注意它们如何区分大小写。
提示:不要使用自定义格式,而要使用标准ISO 8601格式。
java.time 类默认使用标准格式。因此,无需指定格式格式。
LocalDateTime.parse(
"1990-01-01T10:10"
)
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。