JAVA中未发生从字符串到日期的转换

JAVA中未发生从字符串到日期的转换,java,date-parsing,incompatibletypeerror,date,Java,Date Parsing,Incompatibletypeerror,Date,我有字符串格式的英文日期,比如2011-12-12。 我需要将其转换为日期格式,因此我尝试: String assignDates="2011-12-12"; DateFormat df = new SimpleDateFormat("YYYY-MM-dd"); Date dates = df.parse(assignDates); cstmt.setDate(2,dates); 但是我需要将它设置为cstmt.setDate2,dates;但它向我展示了这行中的错误

我有字符串格式的英文日期,比如2011-12-12。 我需要将其转换为日期格式,因此我尝试:

 String assignDates="2011-12-12";
    DateFormat df = new SimpleDateFormat("YYYY-MM-dd");
    Date dates = df.parse(assignDates);
    cstmt.setDate(2,dates);
但是我需要将它设置为cstmt.setDate2,dates;但它向我展示了这行中的错误,如下所示:

类型PreparedStatement中的方法setDateint,java.sql.Date 不适用于参数int、java.util.Date

完整代码为:

public String getConvertedDateToBs(String assignDates) {
        try
        {
            DateFormat df = new SimpleDateFormat("YYYY-MM-dd");
            System.out.println("yo ni chiryo"+assignDates);
        conn = DriverManager.getConnection(dbProperties.getDatabaseUrl());
        System.out.println("chiryoassignDatea");
            CallableStatement cstmt = conn.prepareCall("{? = call PCFN_LIB_ETON(?)}");
            cstmt.registerOutParameter(1,Types.VARCHAR);
            //java.sql.Types.VARBINARY
            Date dates = df.parse(assignDates);
            cstmt.setDate(2,dates);
            cstmt.executeUpdate();
            dateInBs = cstmt.getString(1);

            /*dateInBs = df.format(assignBsDate);*/
            System.out.println(dateInBs);
        }
        catch (SQLException e)
        {
          System.err.println(e.getMessage());
        }
        return dateInAd;
    }

假设您至少使用JDBC 4.2版(您可能正在使用),这比您认为未测试的要简单得多:

        LocalDate date = LocalDate.parse(assignDates);
        cstmt.setObject(2, date);
不需要DateFormat/SimpleDataFormat,也不需要java.util.Date或java.sql.Date。这是非常好的,因为这些类都有设计问题,特别是第一个类是出了名的麻烦。所有这些旧课程都被认为早已过时

而是使用java.time中的LocalDate,这是现代java日期和时间API。现代的API更易于使用


我利用了一个事实,即您的字符串2011-12-12采用ISO 8601格式,现代日期和时间类解析并打印为默认格式,也就是说,没有任何显式格式化程序。

您的错误已经解释清楚了。setDate方法需要java.sql.Date类型。但是,您的日期是java.util.date type->change cstmt.setDate2,new java.sql.Datedates.getTimeImports有问题吗?java.sql.Date或java.util.Date首先验证格式说明符是您真正想要的-;其次,考虑使用JavaTimeAPI代替如何显示;第三,错误消息似乎很明显,当方法需要java.sql.Date时,您使用的是java.util.Date-您的类型错误不是您要求的,而是您想要的yyyy-MM-dd。Y与Y不同-它被添加到java中是为了找出不阅读Javadocs的人。实际上,最简单的方法是导入java.sql.Date,而不是java.util.Date。然后,您可以在字符串中写入Date.valueof,所有问题都将消失。如果您出于其他原因需要java.util.Date,但确实不需要,因为它现在已经过时了,您可以只编写java.sql.Date.valueOfyourString而不导入java.sql.Date。