我意识到这已被问到很多。我确实看了。我花了好几个小时环顾四周,试图解决这个问题。我应该制作一个程序来存储数据库中约会列表的内容,包括描述,日期,开始时间和结束时间。它必须从用户输入添加或取消约会,所以据我所知,这意味着我需要将字符串转换为日期。
这是我的进口: 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
}
}
答案 0 :(得分:34)
将输入格式更改为yyyy-MM-dd
并使用java.sql.Date.valueOf(String date)
方法将上述格式的字符串直接转换为java.sql.Date值会更加简单。
答案 1 :(得分:3)
这应该有效:
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;
}
答案 2 :(得分: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
重复。使用已经被标准库使用的类名称并不是一种好的编码风格。
答案 3 :(得分:1)
java.sql.Date
和java.util.Date
是两个不同的类。您需要将sql日期转换为与Calendar兼容的util日期。
Date jDate = new Date(sqlDate.getTime());
反之亦然
java.sql.Date sqlDate = new java.sql.Date(jDate.getTime());
答案 4 :(得分:1)
sqlDate = new java.sql.Date(apptDay.getTime());
答案 5 :(得分:1)
Date.valueOf(scanner.nextLine())
答案 6 :(得分:1)
String strDate = scanner.nextLine();
SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd");
java.util.Date date = format.parse(strDate);
答案 7 :(得分: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();
答案 8 :(得分:0)
是时候有人写这个问题的现代答案了。
假设您正在使用(或可以开始使用)符合JDBC 4.2的驱动程序,则不应同时使用两个Date
类或DateFormat
或SimpleDateFormat
。所有这些类的设计都不好,最后两个类特别麻烦。他们也早已过时。取而代之的是依靠Java.time(现代的Java日期和时间API)。可以更好地工作。我们需要一个LocalDate
和一个DateTimeFormatter
。
现在我们要解决了,也不要使用java.sql.Time
。从java.time使用LocalTime
。
因此,您的变量声明变为:
//get the info
String desc = getDesc();
LocalDate apptDay = getDay();
LocalTime[] times = getTime();
LocalTime startTime = times[0];
LocalTime endTime = times[1];
int key;
仅用于将java.time对象传递到准备好的语句中,而不使用setDate
和setTime
。您需要使用setObject
:
stat.setInt(1, key);
stat.setString(2, desc);
stat.setObject(3, apptDay);
stat.setObject(4, startTime);
stat.setObject(5, endTime);
stat.execute();
其他一切都和以前一样。要将用户输入的字符串解析为LocalDate
,下面是一个简短的演示:
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy/M/d");
String input = "2019/11/09";
try {
LocalDate aptDate = LocalDate.parse(input, dateFormatter);
System.out.println("Parsed date: " + aptDate);
} catch (DateTimeParseException dtpe) {
System.out.println("Please enter a valid date. Format is yyyy/mm/dd");
}
最后一个代码段的输出是:
分析日期:2019-11-09
我在格式模式字符串中仅指定了一个M
和一个d
,以允许用户输入月份和月份中的一两位数字,例如2019/11/9
。我认识的大多数用户都会对此表示赞赏。