【问题标题】:While converting String to Date got ambiguity between java.util.Date and java.sql.Date在将 String 转换为 Date 时,java.util.Date 和 java.sql.Date 之间存在歧义
【发布时间】:2016-07-13 07:30:12
【问题描述】:

我正在尝试从 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 found:java.util.Date

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

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

【问题讨论】:

标签: java date ambiguity date-conversion


【解决方案1】:

如果您需要 java.sql.Date(并且需要不兼容的类型:java.sql.Date 找到:java.util.Date 表明您需要),请删除 java.util.Date 的导入并使用java.util.DateDateFormat 返回,以构造类似的 java.sql.Date

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

【讨论】:

    【解决方案2】:

    tl;博士

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

    详情

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

    java.time

    java.time 框架内置在 Java 8 中,后来取代了设计不佳、麻烦的旧 java.util.Date/.Calendar 类及其同类。新类的灵感来自非常成功的Joda-Time 框架,在概念上相似但重新架构。由JSR 310 定义。请参阅Oracle Tutorial。由ThreeTen-Extra 项目扩展。 ThreeTen-Backport 项目向后移植到 Java 6 和 7,该项目由 ThreeTenABP 项目包装以供在 Android 中使用。

    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 driver 尚未针对 JDBC 4.2 或更高版本进行更新,请在 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.DateCalendarSimpleDateFormat

    Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

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

    从哪里获得 java.time 类?

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-29
      • 2016-02-14
      • 2012-08-21
      • 2014-04-19
      • 2018-04-03
      • 2013-06-30
      • 1970-01-01
      • 2015-04-03
      相关资源
      最近更新 更多