2013-08-26 18 views
10

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

Это мои импортные товары: import java.io.File; импорт java.io.IOException; импорт java.sql.Connection; import java.sql.Date; импорт java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; импорт java.sql.SQLException; import java.sql.Time; import java.text.DateFormat; import java.text.ParseException; import 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 
    } 
} 

ответ

31

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

+0

Это, похоже, сработало! Спасибо! Но теперь у меня такая же проблема с Времени. Есть ли что-то подобное этому, которое будет работать с hh: mm? (Я попытался повысить это, но я не достаточно крут. T_T) – Tajha

+0

Похоже, что существует также 'Time.valueOf (String x)', но для этого требуется hh: mm: ss format ... Мне бы хотелось слышите, если есть простой способ избавиться от секунд, поскольку они мне не нужны, но я думаю, что могу обойти это. – Tajha

+1

Да, theres обходной путь, попросите формат ввода hh: mm, а затем добавьте «: 00» к результату, затем проанализируйте ... –

1

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

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

и наоборот

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

Да, в моем копания я обнаружил, что это были два разных класса. Я не использую класс Calendar, я создаю базу данных Calendar, для которой мне, по-видимому, нужен java.sql.Date, правильно? У меня есть этот первый там, чтобы заставить его работать (util -> sql). Может быть, это поможет, если я напишу бит кода, где это называется? – Tajha

+0

Ahh, просто знайте, какие классы совместимы с классом Date. Вы не можете просто вводить их друг в друга. – rocketboy

+0

Я знаю это, но я до сих пор не знаю, как это сделать. Я не импортировал java.util.Date, поэтому я подумал, что когда я преобразовал ввод строки в дату, это будет java.sql.Date (что я могу ошибаться, но я думаю, что мне нужно для базы данных shenanigans), но то он разбил ошибку о литье java.util.Date в java.sql.Date, и я начал искать ответ. Я сделал кучу модификаций моего исходного кода, пытаясь его исправить. То, что вы видите выше, это то место, где оно произошло, когда я решил, что пришло время обратиться за помощью. – Tajha

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

Да, у меня есть это там, и это все еще дает мне ошибку. – Tajha

+0

Или ... ты говоришь, что это часть, которая дает мне ошибку? – Tajha

+0

Ваш код создает java.util.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; 
} 
+0

Должно, но, по-видимому, нет./Это было последнее, что я пробовал, прежде чем публиковать это, и это все равно дало мне ошибку. Я собираюсь запустить его снова, просто чтобы проверить еще раз, потому что я мог бы просто потерять рассудок, уставившись на код более 12 часов. <(Не только эта проблема, я тоже занимался другими проектами) – Tajha

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.

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

+0

Мне не нужно использовать java.sql.Date, чтобы поместить его в базу данных? =/ И снова: ваша другая заметка, я n00b. Я не понимал, что в стандартной библиотеке есть календарь, пока я не начал копаться, пытаясь понять, почему это не работает ^. ^; – Tajha

+1

Просто, чтобы сделать его простым, вы можете использовать оба, чтобы поместить его в базу данных, возможно, его неправильная форматирование, если вы используете java.util.Date. Важно только то, что вы используете одну и ту же дату во всей программе. – Sarajog

+0

@Tajha Что касается вашей отредактированной версии, вам нужно использовать 'java.sql.Date' в' stat.setDate (3, apptDay); ', тогда вам может потребоваться преобразовать между' java.util.Date' и 'java .sql.Date'. – wxl24life

1
String strDate = scanner.nextLine(); 

SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd"); 
java.util.Date date = format.parse(strDate); 
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(); 
+0

FYI, эти классы теперь устаревшие и я посоветую, вытесненные java. временные классы. –

+0

это правильно, но я только исправил переход от java.util.Date к java.sql.Date. –

+0

«java.sql.Date» - ужасный неуклюжий хак, плохо спроектированный. Лучше всего избегать или минимизировать его использование. Вместо этого используйте классы java.time. Драйверы JDBC, совместимые с JDBC 4.2 и более поздними версиями, могут напрямую обращаться к типам java.time. –