Строка в java.sql.Date

Я понимаю, что это было задано очень много. Я действительно посмотрел. Я часами оглядывался и пытался понять это. Я должен делать программу, которая хранит то, что соответствует списку назначений в базе данных, с описанием, датой, временем начала и временем окончания. Он должен принимать данные от пользователя, чтобы добавлять или отменять встречи, поэтому, насколько я знаю, это означает, что мне нужно преобразовать строку в дату.

Это мой импорт:   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
    }
}

Ответ 1

Было бы намного проще изменить формат ввода на yyyy-MM-dd и использовать метод java.sql.Date.valueOf(String date), который преобразует строку в указанном выше формате непосредственно в значение java.sql.Date.

Ответ 2

Это должно работать:

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;
}

Ответ 3

Следующий оператор вызвал ошибку:

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

Фактически, тип возвращаемого значения java.text.DateFormat.parse(String) равен java.util.Date, что несравнимо с java.sql.Date.

В вашей ситуации самым простым способом может быть java.util.Date вместо java.sql.Date.

Другое примечание: ваше имя класса Calendar дублируется с java.util.Calendar. И это не хороший стиль кодирования, чтобы использовать имена классов, которые уже используются стандартной библиотекой.

Ответ 4

java.sql.Date и java.util.Date - это два разных класса. Вам нужно преобразовать дату sql в дату использования, которая совместима с Calendar.

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

и наоборот

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

Ответ 5

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

Ответ 6

Date.valueOf(scanner.nextLine())

Ответ 7

String strDate = scanner.nextLine();

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

Ответ 8

Попробуйте метод ниже -

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();