将选择的日期替换为JDBC而不是当前日期

时间:2016-04-14 06:29:42

标签: java jsp datetime servlets jdbc

我的问题是从JSP输入数据库的日期是今天的日期而不是用户选择的日期。

JSP文件:

<td><input type="date" name="availableDate" /></td>

Servlet:

String[] presentationID = request.getParameterValues("selectavailability");
String[] availableDay =  request.getParameterValues("availableDay"); 
String[] availableStart =  request.getParameterValues("availableStart");
String[] availableEnd =  request.getParameterValues("availableEnd");
String[] availableDate = request.getParameterValues("availableDate");  

SimpleDateFormat availDate = new SimpleDateFormat("yyyy-MM-dd");

try
{

 for (int i = 0; i < availableDay.length; i++) 
 {

   AvailabilityBean available = new  AvailabilityBean();         

   available.setLecturerID(request.getParameter("lecturerID"));
   available.setAvailableDay(availableDay[i]);
   available.setAvailableStart(availableStart[i]);
   available.setAvailableEnd(availableEnd[i]);

   Date chosenDate = availDate.parse(availableDate[i]);
   available.setAvailableDate(chosenDate);
   available = AddAvailableDAO.addavailable(available);
   }
   }

DAO:

 String lecturerID = Abean.getLecturerID();
    String availableDay = Abean.getAvailableDay();
    String availableStart = Abean.getAvailableStart();
    String availableEnd = Abean.getAvailableEnd();
   // Date availableDate = Abean.getAvailableDate();
    String presentationID = Abean.getPresentationID();

try{  


    currentCon = JavaConnectionDB.getConnection();

    Date availableDate = Abean.getAvailableDate();           
   // java.util.Date date = new java.util.Date();
    java.sql.Date sqlDate = new java.sql.Date(availableDate.getTime()); //I THINK SOMETHING IS WRONG HERE

    PreparedStatement ps=currentCon.prepareStatement("insert into availability (availableID,lecturerID,availableDay,availableStart,availableEnd,availableDate,presentationid) values (availabilityseq.nextval,?,?,?,?,?,?)");  
            ps.setString(1,Abean.getLecturerID());  
            ps.setString(2,Abean.getAvailableDay());  
            ps.setString(3,Abean.getAvailableStart()); 
            ps.setString(4,Abean.getAvailableEnd()); 
            ps.setDate(5,sqlDate);        
            ps.setString(6,Abean.getPresentationID()); 
            ps.executeUpdate();

 }

豆:

    private String availableID;
    private String lecturerID;
    private String availableDay;
    private String availableStart;
    private String availableEnd;
    private Date availableDate;
    private String presentationID;

我该如何解决这个问题?

编辑:我添加了我的servlet的一部分,包括解析availableDate和DAO的值

4 个答案:

答案 0 :(得分:1)

此代码错误:

java.util.Date date = new java.util.Date();

在这里,您要创建一个新的Date对象,其值始终为当前日期

  

您应该从中提取用户选择的日期值   Dao方法中的AvailabilityBean对象

。考虑到您的代码,我认为更改的代码应如下所示:

java.sql.Date sqlDate = new java.sql.Date(Abean.getAvailableDate().getTime());

答案 1 :(得分:1)

此处您只创建current date对象,而您没有设置用户选择的日期值。

java.util.Date date = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(date.getTime()); 

请尝试以下代码:

//1. assuming Abean returning date in string value.
String availableDate = Abean.getAvailableDate();

// parsing the availableDate to string to date object.
DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); // you can use your own date format here instead of 'MM/dd/yyyy'
Date choosenDate = df.parse(availableDate);

// coverting java date object to java.sql date object.
java.sql.Date sqlDate = new java.sql.Date(choosenDate.getTime());

修改  如果availableDate是日期对象,则可以直接使用以下内容:

Date availableDate = Abean.getAvailableDate();
java.sql.Date sqlDate = new java.sql.Date(availableDate.getTime());

现在,您将在sqlDate变量中选择用户。

答案 2 :(得分:0)

您正在创建一个新日期,就在创建“PreparedStatement”之前:

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

使用此代码,您将获得“今天日期”,之后,在“ ps ”中添加参数#5

PreparedStatement ps=currentCon.prepareStatement("insert into availability (availableID,lecturerID,availableDay,availableStart,availableEnd,availableDate,presentationid) values (availabilityseq.nextval,?,?,?,?,?,?)");  
        ps.setString(1,Abean.getLecturerID());  
        ps.setString(2,Abean.getAvailableDay());  
        ps.setString(3,Abean.getAvailableStart()); 
        ps.setString(4,Abean.getAvailableEnd()); 
        **ps.setDate(5,sqlDate**);        
        ps.setString(6,Abean.getPresentationID()); 
        ps.executeUpdate();

这就是你在数据库中获得'今天的日期'的原因。 在参数#5中使用对适当方法的调用:

ps.setDate(5,Abean.getAvailableDate());

答案 3 :(得分:0)

其他答案是正确的和有益的。但是他们使用过时的老课程。

java.time

java.time框架取代了与最早版本的Java捆绑在一起的旧日期时间类。旧课程设计糟糕,令人困惑,麻烦。

请勿使用java.util.Datejava.util.Calendarjava.text.SimpleDateFormat及其兄弟姐妹。 Sun和Oracle放弃了这些类,决定将内置的java.time类作为替代。

{8}类内置于Java 8及更高版本中。见java.time。他们的大部分功能都是Oracle Tutorialback-ported to Java 6 & 7。由to Android定义,受JSR 310启发,并由Joda-Time扩展。 java.time框架是Joda-Time的官方继承者,但是如果你小心使用import语句,你可以在项目中使用它们,因为有些类共享相同的名称。有关java.time的更多信息,请搜索Stack Overflow。

LocalDate

在新类中,LocalDate表示没有时间且没有时区的仅限日期的值。

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;

您可以通过解析字符串或指定数字来实例化。

LocalDate localDate = LocalDate.parse( "2016-01-23" );
LocalDate localDate = LocalDate.of( 2016 , 1 , 23 );

SQL&amp; JDBC

希望JDBC驱动程序将更新为直接使用java.time类型。在此之前,我们必须使用java.sql类型将数据移入/移出数据库。查找添加到旧类的新方法,以便于转换为/从java.time类型转换。

java.sql.Date sqlDate = java.sql.Date.valueOf( localDate );

走向另一个方向。

LocalDate localDate = sqlDate.toLocalDate();

尽量减少使用java.sql.Date;仅用于与数据库一起传输。使用java.time作为业务逻辑。