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

如何在JSP中将SQL日期(yyyy-mm-dd)转为仅显示年份?代码报错求助

解决JDBC日期提取年份时的类型不匹配问题

你在JSP里处理出生日期提取年份时遇到的类型不匹配报错,本质是java.util.Date和java.sql.Date的类型冲突,我来帮你拆解问题并给出实用的解决方案:

问题根源

你的代码里SimpleDateFormat.parse()返回的是**java.util.Date**类型,但你可能把变量year声明成了java.sql.Date,或者后续逻辑需要的是SQL Date类型,这就导致了类型不兼容。而且其实还有个更简单的思路:既然你拿到的dob已经是yyyy-mm-dd格式的字符串,完全没必要先转成Date再提取年份。


方案1:直接处理字符串(最简单高效)

因为传入的日期格式固定是yyyy-mm-dd,直接截取前4位就能拿到年份,完全绕开Date类型转换的麻烦:

<% 
String birthdate = request.getParameter("dob");
// 截取yyyy-mm-dd的前4位,就是年份
String birthYear = birthdate.substring(0, 4);
%>

<!-- 页面上直接显示年份 -->
出生年份:<%= birthYear %>

方案2:正确处理Date类型转换(如果需要Date对象)

如果你确实需要把年份转换成Date类型(比如后续还要做日期计算),要明确区分java.util.Date和java.sql.Date的转换:

<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.sql.Date" %>
<% 
String birthdate = request.getParameter("dob");
SimpleDateFormat yearFormatter = new SimpleDateFormat("yyyy");

// 先获取java.util.Date对象
Date utilDate = yearFormatter.parse(birthdate);
// 转换为java.sql.Date(通过毫秒数构造)
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());

// 如果只是要显示年份,还是转成字符串更直接
String yearStr = yearFormatter.format(utilDate);
%>

⚠️ 注意:SimpleDateFormat是线程不安全的,在JSP这种多线程环境下,推荐改用Java 8+的DateTimeFormatter(线程安全且更易用):

<%@ page import="java.time.LocalDate" %>
<%@ page import="java.time.format.DateTimeFormatter" %>
<% 
String birthdate = request.getParameter("dob");
LocalDate localDate = LocalDate.parse(birthdate);
// 直接获取年份
int birthYear = localDate.getYear();
%>

额外建议

如果这个dob是从数据库通过JDBC查询出来的,建议在后端(比如Servlet或者Service层)就先提取好年份,再把年份字符串传到JSP里——这样JSP只负责展示逻辑,更符合MVC的设计思想,也能避免在JSP里写过多的Java代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:52:38