You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将HTML Date输入值转为Java Date对象(Thymeleaf场景)

Thymeleaf表单绑定Date类型字段的解决方案

问题场景

需要通过Thymeleaf表单为Projekt对象的datum_start和datum_end(均为Date类型)赋值,但HTML的date输入控件无法直接传递Date对象到后端,导致后端接收的日期字段为null。

现有代码

Thymeleaf表单代码

<form action="#" th:action="@{neuesProjektErstellen}" th:object="${Projekt}" method="post">
    Name: <input type="text" th:field="*{name}" required/><br>
    Beschreibung: <input type="text" th:field="*{beschreibung}" required/><br>
    Startdatum: <input type="date" th:field="*{datum_start}" id="datum_startProjektAdd" required/><br>
    Enddatum: <input type="date" th:field="*{datum_end}" id="datum_endProjektAdd" required/><br>
    <br>
    <input type="submit" value="Projekt erstellen"/>
    <input type="reset" value="Clear"/>
</form>

注:原表单中Enddatum的required属性拼写错误(写成了equired),需修正以确保前端验证生效。

Controller处理方法

@PostMapping("/neuesProjektErstellen")
public String neuesProjektErstellen(@ModelAttribute(value = "Projekt") Projekt projekt, Model m)
{
    if(projekt.getDatum_start()==null || projekt.getDatum_end()==null)
    {
        return "DatumFalsch";
    }
    else {
        projektRepository.save(projekt);
        return "redirect:Projekte";
    }
}

Projekt实体类字段

@Column (columnDefinition = "date")
private Date datum_start;
@Column (columnDefinition = "date")
private Date datum_end;

可行解决方向

1. 为实体类字段添加@DateTimeFormat注解

HTML的date输入控件会以yyyy-MM-dd格式提交日期字符串,只需在实体类的Date字段上添加@DateTimeFormat注解,指定对应格式,Spring就能自动完成字符串到Date的转换。

修改后的实体类字段代码:

@Column (columnDefinition = "date")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date datum_start;

@Column (columnDefinition = "date")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date datum_end;

2. 配置全局日期格式化规则

如果项目中有多个Date类型字段需要绑定,可通过配置类设置全局日期转换规则,避免逐个字段添加注解。

创建配置类:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        registry.addFormatterForFieldType(Date.class, new DateFormatter(dateFormatter.toPattern()));
    }
}

3. 手动接收并转换日期(备选方案)

若上述自动转换方案不适用,可在Controller中直接接收字符串类型的日期参数,手动转换为Date对象后设置到Projekt实例中。

修改后的Controller代码:

@PostMapping("/neuesProjektErstellen")
public String neuesProjektErstellen(@RequestParam("datum_start") String startDateStr,
                                    @RequestParam("datum_end") String endDateStr,
                                    @ModelAttribute(value = "Projekt") Projekt projekt,
                                    Model m) {
    try {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date startDate = sdf.parse(startDateStr);
        Date endDate = sdf.parse(endDateStr);
        projekt.setDatum_start(startDate);
        projekt.setDatum_end(endDate);
        
        projektRepository.save(projekt);
        return "redirect:Projekte";
    } catch (ParseException e) {
        return "DatumFalsch";
    }
}

内容的提问来源于stack exchange,提问作者TrYxer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:57:34