15

我意识到这已经被问了很多。我确实看过。我花了几个小时环顾四周并试图弄清楚这一点。我应该制作一个程序,在数据库中存储相当于约会列表的内容,包括描述、日期、开始时间和结束时间。它必须接受用户的输入才能添加或取消约会,所以据我所知,这意味着我需要将字符串转换为日期。

这些是我的导入:import java.io.File;导入 java.io.IOException;导入java.sql.Connection;导入java.sql.Date;导入 java.sql.PreparedStatement;导入java.sql.ResultSet;导入 java.sql.ResultSetMetaData; 导入java.sql.SQLException;导入java.sql.Time;导入 java.text.DateFormat;导入 java.text.ParseException;导入 java.text.SimpleDateFormat;导入 java.util.ArrayList;导入 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
    }
}
4

9 回答 9

45

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

于 2013-08-26T07:42:21.770 回答
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;
}
于 2013-08-26T07:19:09.067 回答
2

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

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

反之亦然

  java.sql.Date sqlDate =  new java.sql.Date(jDate.getTime());
于 2013-08-26T07:17:16.213 回答
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. 使用标准库已经使用的类名也不是一种好的编码风格。

于 2013-08-26T07:39:13.023 回答
1
   sqlDate = new java.sql.Date(apptDay.getTime());
于 2013-08-26T07:17:55.030 回答
1
Date.valueOf(scanner.nextLine())
于 2015-10-13T09:01:19.707 回答
1
String strDate = scanner.nextLine();

SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd");
java.util.Date date = format.parse(strDate);
于 2015-10-13T11:37:58.963 回答
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();
于 2017-06-03T03:53:55.193 回答
0

java.time

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

假设您正在使用(或可以开始使用)符合 JDBC 4.2 的驱动程序,则不应使用这两个DateDateFormatSimpleDateFormat. 所有这些类都设计得很糟糕,最后两个特别麻烦。它们也早已过时。而是依赖 java.time,现代 Java 日期和时间 API。与它一起工作要好得多。我们需要 aLocalDate和 a DateTimeFormatter

现在我们正在使用它,不要使用java.sql.Time任何一个。LocalTime从 java.time使用。

所以你的变量声明变成:

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

仅用于将 java.time 对象传递给您不使用的准备好的语句setDateand setTime。您需要使用setObject

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

其他一切都和以前一样。为了将用户输入字符串解析为 a 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. 我认识的大多数用户都会对此表示赞赏。

关联

于 2019-10-28T04:05:28.560 回答