web-dev-qa-db-fra.com

Chaîne en Java.sql.Date

Je réalise que cela a été beaucoup demandé. J'ai effectivement regardé. J'ai passé des heures à regarder autour de moi et à essayer de comprendre cela. Je suis censé créer un programme qui stocke une liste de rendez-vous dans une base de données, avec une description, une date, une heure de début et une heure de fin. Il doit prendre l’entrée de l’utilisateur pour ajouter ou annuler des rendez-vous, donc, autant que je sache, cela signifie que je dois convertir une chaîne en date. 

Ce sont mes importations: importer Java.io.File; import Java.io.IOException; import Java.sql.Connection; importer Java.sql.Date; importer Java.sql.PreparedStatement; importer Java.sql.ResultSet; importer Java.sql.ResultSetMetaData; importer Java.sql.SQLException; importer Java.sql.Time; importer Java.text.DateFormat; importer Java.text.ParseException; importer Java.text.SimpleDateFormat; importer Java.util.ArrayList; importer Java.util.Scanner;

Comme vous pouvez le voir, pas de Java.util.Date ici. Voici le bit où je reçois l'erreur:

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

J'ai ajouté Java.sql.Dates à cela et jeté avec elle un tas d'essais de le faire fonctionner, mais il me donne toujours ceci:

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

Toute idée sur ce que je fais mal ou sur la façon de faire ce travail serait très appréciée.

Edit: Je pensais que cela aiderait peut-être d’ajouter le morceau de code qui appelle cela, alors il sera peut-être plus clair comment je tente de l’utiliser. ) est appelé et où il va.

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
    }
}
10
Tajha

Il serait beaucoup plus simple de changer le format d'entrée en yyyy-MM-dd et d'utiliser la méthode Java.sql.Date.valueOf(String date) qui convertit directement une chaîne du format précédent en une valeur Java.sql.Date.

33
Evgeniy Dorofeev

Cela devrait fonctionner:

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
Jainendra

L'instruction suivante a provoqué l'erreur:

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

En fait, le type de valeur de retour de Java.text.DateFormat.parse(String) est Java.util.Date, ce qui est incomparable avec Java.sql.Date.

Dans votre cas, le moyen le plus simple consiste peut-être à utiliser Java.util.Date au lieu de Java.sql.Date.

Autre remarque: votre nom de classe Calendar est dupliqué avec Java.util.Calendar. Et ce n’est pas un bon style de codage d’utiliser des noms de classe déjà utilisés par la bibliothèque standard.

2
wxl24life
String strDate = scanner.nextLine();

SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd");
Java.util.Date date = format.parse(strDate);
1
Eun Chong Lim
Date.valueOf(scanner.nextLine())
1
Eun Chong Lim

Java.sql.Date et Java.util.Date sont deux classes différentes. Vous devez convertir la date SQL en date d'utilisation compatible avec Calendar.

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

et vice versa

  Java.sql.Date sqlDate =  new Java.sql.Date(jDate.getTime());
1
rocketboy
   sqlDate = new Java.sql.Date(apptDay.getTime());
1
Maurice Perry

Essayez la méthode ci-dessous -

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

Et à partir de la méthode main(), appelez cette méthode -

Date birthday = getDay();