在将 String 转换为 Date 时,java.util.Date 和 java.sql.Date 之间出现歧义

While converting String to Date got ambiguity between java.util.Date and java.sql.Date

我正在尝试从 HTML

的日期标签中获取日期作为输入

Birth Date <input type="date" name="dob"/>

并使用

访问jsp页面
String strDate = request.getParameter("dob");

但是它returns是字符串格式,我想把它转换成最新的,我试过如下

SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(strDate);

但是报错

incompatible types required: java.sql.Date found: java.util.Date

当我导入 pakage "java.util.*" 以使用 java.util.Date date = sdf.parse(strDate); 时,它给出

reference to Date is ambiguous, both class java.util.Date in java.util and class java.sql.Date in java.sql match

如果您需要 java.sql.Date(并且需要 不兼容的类型:java.sql.Date 发现:java.util.Date 表示您需要),删除导入java.util.Date 并使用 DateFormat 返回的 java.util.Date 构造一个 java.sql.Date 类似

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
    Date date = new Date(sdf.parse(strDate).getTime());
} catch (ParseException e) {
    e.printStackTrace();
}

tl;博士

LocalDate.parse( "2018-01-23" )

详情

是正确的。那里的一条评论询问是否有更好的转换建议。确实有更好的方法。奖励:更好的方法避免了最初的问题,将 java.util.Datejava.sql.Date.

混淆

java.time

java.time framework built into Java 8 and later supplants the poorly-designed troublesome old java.util.Date/.Calendar classes and their kin. The new classes are inspired by the highly successful Joda-Time framework, similar in concept but re-architected. Defined by JSR 310. See the Oracle Tutorial. Extended by the ThreeTen-Extra project. Back-ported to Java 6 & 7 by the ThreeTen-Backport project, which is wrapped for use in Android by the ThreeTenABP 项目。

LocalDate class 表示仅日期值,没有时间和时区。

ISO 8601

您输入的字符串恰好符合ISO 8601标准。

此标准在 java.time classes 中默认用于 parsing/generating 日期时间字符串。因此无需指定格式模式。

LocalDate localDate = LocalDate.parse( "2016-01-23" );

数据库

JDBC 4.2 及更高版本开始,您可以通过 getObject/[=22= 直接与数据库交换 java.time 对象] 方法。

JDBC 4.2 及更高版本

Insert/Update.

myPreparedStatement.setObject( … , localDate ) ;

检索。

LocalDate localDate = myResultSet.getObject( … , LocalDate.class ) ;

JDBC 4.1 及更早版本

如果您的 JDBC driver 尚未针对 JDBC 4.2 或更高版本进行更新,请在 java.time 和 java.sql 类型之间进行转换。旧的 java.sql classes 有用于此类转换的新方法。

对于 LocalDate,将 to/from 转换为 java.sql.Date class(伪装成仅日期值)。

java.sql.Date mySqlDate = java.sql.Date.valueOf( localDate );

...然后转向另一个方向...

java.time.LocalDate localDate = mySqlDate.toLocalDate();

关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC driver。不需要字符串,不需要 java.sql.* classes.

从哪里获得java.time classes?

  • Java SE 8, Java SE 9, Java SE 10,及以后
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and Java SE 7
  • Android
    • Android java.time classes.
    • 捆绑实施的更高版本
    • 对于较早的 Android (<26),ThreeTenABP project adapts ThreeTen-Backport (mentioned above). See .

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.