字符串到java.sql.Date

时间:2013-08-26 07:13:44

标签: java sql eclipse date derby

我意识到这已被问到很多。我确实看了。我花了好几个小时环顾四周,试图解决这个问题。我应该制作一个程序来存储数据库中约会列表的内容,包括描述,日期,开始时间和结束时间。它必须从用户输入添加或取消约会,所以据我所知,这意味着我需要将字符串转换为日期。

这是我的进口:     import java.io.File;     import java.io.IOException;     import java.sql.Connection;     import java.sql.Date;     import java.sql.PreparedStatement;     import java.sql.ResultSet;     import java.sql.ResultSetMetaData;     import java.sql.SQLException;     import java.sql.Time;     import java.text.DateFormat;     import java.text.ParseException;     import java.text.SimpleDateFormat;     import java.util.ArrayList;     import java.util.Scanner;

如您所见,那里没有java.util.Date。这是我得到错误的位置:

private static java.sql.Date getDay()
{
    Scanner in = new Scanner(System.in);
    String input;
    Date apptDay = null;
    DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
    java.sql.Date sqlDate;
    System.out.println("\nPlease enter the date of the appointment, format: yyyy/mm/dd");
    while(apptDay == null)
    {
        try
        {
            input = in.next();
            apptDay = (Date) df.parse(input);
        }
        catch(ParseException e)
        {
            System.out.println("Please enter a valid date! Format is yyyy/mm/dd");
        }
    }
    sqlDate = new Date(apptDay.getTime());
    return sqlDate;
}

我已经向它添加了java.sql.Dates,并试图让它工作,但它仍然给我这个:

Exception in thread "main" java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date at Calendar.getDay(Calendar.java:47)

对于我做错了什么或如何使这项工作的任何想法都将非常感激。

编辑:我想也许如果我添加一些调用它的代码可能会有所帮助,所以也许我会更清楚我是如何使用它的,所以这里是addAppointment()方法,所以你可以看到在哪里调用getDay()以及它在哪里。

public static void addAppointment() throws SQLException
{
    //get the info
    String desc = getDesc();
    java.sql.Date apptDay = getDay();
    Time[] times = getTime();
    Time startTime = times[0];
    Time endTime = times[1];
    int key;

    Connection conn = SimpleDataSource.getConnection(); //connect to the database

    try
    {
        PreparedStatement max = conn.prepareStatement("SELECT MAX(ID) FROM Calendar");
        ResultSet result = max.executeQuery();
        key = result.getInt("ID") + 1; 
        PreparedStatement stat = conn.prepareStatement(
                "INSERT INTO Calendar " +
                "VALUES (?, ?, ?, ?, ?)"); 
        stat.setInt(1, key);
        stat.setString(2, desc); 
        stat.setDate(3, apptDay);
        stat.setTime(4, startTime);
        stat.setTime(5, endTime);
        stat.execute();
        System.out.println("\nAppointment added!\n");
    }
    finally
    {
        conn.close(); //finished with the database
    }
}

9 个答案:

答案 0 :(得分:34)

将输入格式更改为yyyy-MM-dd并使用java.sql.Date.valueOf(String date)方法将上述格式的字符串直接转换为java.sql.Date值会更加简单。

答案 1 :(得分:3)

这应该有效:

private static java.sql.Date getDay()
{
    Scanner in = new Scanner(System.in);
    String input;
    Date apptDay = null;
    DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
    java.sql.Date sqlDate;
    System.out.println("\nPlease enter the date of the appointment, format: yyyy/mm/dd");
    while(apptDay == null)
    {
        try
        {
            input = in.next();
            apptDay = (Date) df.parse(input);
        }
        catch(ParseException e)
        {
            System.out.println("Please enter a valid date! Format is yyyy/mm/dd");
        }
    }
    sqlDate = new java.sql.Date(apptDay.getTime());
    return sqlDate;
}

答案 2 :(得分:2)

以下语句导致错误:

apptDay = (java.sql.Date) df.parse(input);

事实上,java.text.DateFormat.parse(String)的返回值类型为java.util.Date,与java.sql.Date无法比较。

在您的情况下,最简单的方法可能是使用java.util.Date而不是java.sql.Date

另一个注意事项:您的班级名称Calendarjava.util.Calendar重复。使用已经被标准库使用的类名称并不是一种好的编码风格。

答案 3 :(得分:1)

java.sql.Datejava.util.Date是两个不同的类。您需要将sql日期转换为与Calendar兼容的util日期。

  Date jDate =  new Date(sqlDate.getTime());

反之亦然

  java.sql.Date sqlDate =  new java.sql.Date(jDate.getTime());

答案 4 :(得分:1)

   sqlDate = new java.sql.Date(apptDay.getTime());

答案 5 :(得分:1)

Date.valueOf(scanner.nextLine())

答案 6 :(得分:1)

String strDate = scanner.nextLine();

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

答案 7 :(得分:0)

尝试以下方法 -

private static java.sql.Date getDay() throws SQLException {
    Scanner in = new Scanner(System.in);
    String input;
    java.util.Date utilDay = null;
    DateFormat df = new SimpleDateFormat("yyyy-mm-dd");
    System.out.println("\nPlease enter the date of the appointment, format: yyyy-mm-dd");
    while(utilDay == null){
        try{
            input = in.next();
            utilDay = (java.util.Date) df.parse(input);
        }catch(ParseException e){
            System.out.println("Please enter a valid date! Format is yyyy/mm/dd");
        }
   }

   java.sql.Date sqlDate = new java.sql.Date(utilDay.getTime());
   return sqlDate;
}

main()方法开始,调用此方法 -

Date birthday = getDay();

答案 8 :(得分:0)

java.time

是时候有人写这个问题的现代答案了。

假设您正在使用(或可以开始使用)符合JDBC 4.2的驱动程序,则不应同时使用两个Date类或DateFormatSimpleDateFormat。所有这些类的设计都不好,最后两个类特别麻烦。他们也早已过时。取而代之的是依靠Java.time(现代的Java日期和时间API)。可以更好地工作。我们需要一个LocalDate和一个DateTimeFormatter

现在我们要解决了,也不要使用java.sql.Time。从java.time使用LocalTime

因此,您的变量声明变为:

    //get the info
    String desc = getDesc();
    LocalDate apptDay = getDay();
    LocalTime[] times = getTime();
    LocalTime startTime = times[0];
    LocalTime endTime = times[1];
    int key;

仅用于将java.time对象传递到准备好的语句中,而不使用setDatesetTime。您需要使用setObject

        stat.setInt(1, key);
        stat.setString(2, desc); 
        stat.setObject(3, apptDay);
        stat.setObject(4, startTime);
        stat.setObject(5, endTime);
        stat.execute();

其他一切都和以前一样。要将用户输入的字符串解析为LocalDate,下面是一个简短的演示:

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy/M/d");
    String input = "2019/11/09";
    try {
        LocalDate aptDate = LocalDate.parse(input, dateFormatter);
        System.out.println("Parsed date: " + aptDate);
    } catch (DateTimeParseException dtpe) {
        System.out.println("Please enter a valid date. Format is yyyy/mm/dd");
    }

最后一个代码段的输出是:

  

分析日期:2019-11-09

我在格式模式字符串中仅指定了一个M和一个d,以允许用户输入月份和月份中的一两位数字,例如2019/11/9。我认识的大多数用户都会对此表示赞赏。

链接