我的问题是从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的值
答案 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捆绑在一起的旧日期时间类。旧课程设计糟糕,令人困惑,麻烦。
请勿使用java.util.Date
,java.util.Calendar
,java.text.SimpleDateFormat
及其兄弟姐妹。 Sun和Oracle放弃了这些类,决定将内置的java.time类作为替代。
{8}类内置于Java 8及更高版本中。见java.time。他们的大部分功能都是Oracle Tutorial和back-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 );
希望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作为业务逻辑。