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

时间:2016-03-25 14:18:34

标签: java date ambiguity date-conversion

我正在尝试将日期作为HTML的日期标记的输入

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

使用

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

但它以字符串格式返回,我想将其转换为日期,我尝试如下

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

但是它给出了错误

  

需要不兼容的类型:找到java.sql.Date:java.util.Date

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

  

对Date的引用是不明确的,java.util中的类java.util.Date和java.sql中的类java.sql.Date匹配

2 个答案:

答案 0 :(得分:4)

如果您需要java.sql.Date(并且需要不兼容类型:找到java.sql.Date:java.util.Date 表示您这样做),请删除{{1}的导入并使用java.util.Date返回的java.util.Date来构建DateFormat,其内容类似于

java.sql.Date

答案 1 :(得分:3)

TL;博士

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

详细

Answer by Elliott Frisch是正确的。有一条评论询问是否建议更好的转换。确实有更好的方法。额外奖励:更好的方法可以避免原始问题,让java.util.Datejava.sql.Date混淆。

java.time

Java 8及更高版本中内置的java.time框架取代了设计糟糕的旧java.util.Date / .Calendar类及其亲属。新课程的灵感来自非常成功的Joda-Time框架,在概念上类似但重新设计。由JSR 310定义。请参阅Oracle Tutorial。由ThreeTen-Extra项目扩展。后端移植到Java 6&amp; 7由ThreeTen-Backport项目提供,该项目由Android项目包含在ThreeTenABP中使用。

LocalDate类代表一个仅限日期的值,没有时间和没有时区。

ISO 8601

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

默认情况下,此标准在java.time类中用于解析/生成日期时间字符串。因此无需指定格式化模式。

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

数据库

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

JDBC 4.2及更高版本

插入/更新。

myPreparedStatement.setObject( … , localDate ) ;

检索。

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

JDBC 4.1及更早版本

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

对于LocalDate,转换为java.sql.Date类(假装为仅限日期的值)。

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

......走向另一个方向......

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

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于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

相关问题