当前位置: 首页 > 知识库问答 >
问题:

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

周云
2023-03-14

在我的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";
    }
}

和百里香叶形式:

<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>

这个例子有什么问题?我应该如何修复它,使其正确地将< code>String解析为< code>LocalDateTime?

我也在这里提交了示例申请。

更新:

> < li>

在“无法转换”下,我的意思是我遇到了异常:

org.springframework.core.convert.ConversionFailedException:无法从类型[java.lang.String]转换为类型[@javax.validation.constraints.NotNull@org.springframework.format.annotation.DateTimeFormatjava.time.LocalDateTime]的值1990-01-01 10:10

使用小写yyyy修复了该问题。谢谢

共有1个答案

颛孙镜
2023-03-14

格式化模式应为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和更高版本中。这些类取代了麻烦的旧式日期-时间类,如< code>java.util.Date、< code>Calendar,

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

若要了解详细信息,请参阅 Oracle 教程。搜索堆栈溢出以获取许多示例和说明。规格是 JSR 310。

您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,不需要< code>java.sql.*类。

从哪里获得java.time课程?

  • JavaSE 8、JavaSE 9、JavaSE 10及更高版本
    • 内置。
    • 标准JavaAPI的一部分,带有捆绑实现。
    • Java9增加了一些小功能和修复。
    • 大部分 java.time 功能都向后移植到 Java 6
    • java.time类的Android捆绑包实现的更高版本。
    • 对于早期的Android(

    Three10-Extra项目通过附加类扩展java.time。该项目是未来可能添加到java.time.的试验场。您可以在此处找到一些有用的类,例如IntervalYearWeekYearQuarter等。

 类似资料:
  • 问题内容: 我有一个字符串日期“ 31-Dec”和模式“ dd-MMM”。接下来的代码 产生异常 我做错什么了? 谢谢! 问题答案: 一个问题可能是您不是英语。试试这个: 这为我返回: 1970年12月31日星期四00:00:00欧洲中部时间 由于日期字符串中缺少年份,因此您会看到它会自动插入为年份。

  • 我的问题是,当我按Submit时,应用程序崩溃,并在调试中触发以下异常: 这是日期类、保存按钮和日历对话框片段的代码:

  • 问题内容: 我正在尝试解析一个日期,但是奇怪的是我遇到了一个例外。 这是代码: 例外是: 我已经阅读了文档,我认为我的模式是正确的。所以我不明白… 问题答案: 这可能是因为你计算机上的默认语言环境不是英语。 你应该使用: 代替。

  • 问题内容: 我收到以下错误:“ java.text.ParseException:无法解析的日期:“ 2011年8月31日09:53:19””具有以下格式: 有人看到这个问题吗? 问题答案: 确保您使用正确的语言环境。(构造函数使用 系统默认的语言环境 ,它可能不是您要使用的 语言环境 。) 这在我的机器上工作正常: (例如,使用时会产生。)

  • 问题内容: 我想将Twitter响应中的日期字符串转换为Date对象,但是我总是得到ParseException,并且看不到错误! 输入字符串:2010年12月23日星期四18:26:07 +0000 模式: 方法: 我也尝试过此方法:http : //friendpaste.com/2IaKdlT3Zat4ANwdAhxAmZ,但结果相同。 我在Mac OS X上使用Java 1.6。 干杯,

  • 问题内容: 我正在尝试将一个实例转换为一个实例。 我没有得到编译器错误,但是实例值是错误的。 我认为这不起作用,因为它存储时间而不是。 我正在使用JDK 1.8版。 问题答案: 您的输入实际上是一个。简单地将其解析为a 然后从中获取会更简单。无需担心时区,无需保留某些传统课程(避免并在可能的情况下…)