无法在Spring控制器中解析本地日期时间

时间:2018-07-15 13:57:31

标签: java spring validation spring-boot datetime-format

在我的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解决了该问题。谢谢。

1 个答案:

答案 0 :(得分:2)

日历年,而不是基于周的年

格式设置应为uuuu-MM-dd HH:mm

LocalDateTime.parse( 
    "1990-01-01 10:10" , 
    DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm" )
)

大写的YYYY表示基于星期的年份,而不是日历年。

更仔细地研究类文档,以格式化模式代码。注意它们如何区分大小写。

ISO 8601

提示:不要使用自定义格式,而要使用标准ISO 8601格式。

java.time 类默认使用标准格式。因此,无需指定格式格式。

LocalDateTime.parse( 
    "1990-01-01T10:10"
)

关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore