Ответ 1
Было бы намного проще изменить формат ввода на yyyy-MM-dd
и использовать метод java.sql.Date.valueOf(String date)
, который преобразует строку в указанном выше формате непосредственно в значение 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
}
}
Было бы намного проще изменить формат ввода на yyyy-MM-dd
и использовать метод java.sql.Date.valueOf(String date)
, который преобразует строку в указанном выше формате непосредственно в значение java.sql.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 java.sql.Date(apptDay.getTime());
return sqlDate;
}
Следующий оператор вызвал ошибку:
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
. И это не хороший стиль кодирования, чтобы использовать имена классов, которые уже используются стандартной библиотекой.
java.sql.Date
и java.util.Date
- это два разных класса. Вам нужно преобразовать дату sql в дату использования, которая совместима с Calendar.
Date jDate = new Date(sqlDate.getTime());
и наоборот
java.sql.Date sqlDate = new java.sql.Date(jDate.getTime());
sqlDate = new java.sql.Date(apptDay.getTime());
Date.valueOf(scanner.nextLine())
String strDate = scanner.nextLine();
SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd");
java.util.Date date = format.parse(strDate);
Попробуйте метод ниже -
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();