处理日期 java.util、日期 java.sql 和 SimpleDateFormat
Handling dates java.util, dates java.sql and SimpleDateFormat
我在处理程序中不同格式的日期时遇到问题。
就像现在一样,我的查询已执行,但我以 YYYY-MM-DD 格式从数据库中获取日期。
我希望它们采用 DD-MM-YYYY HH:mm 格式。
在 SQL 文件中,日期定义如下(在 INSERT INTO 指令中):
to_date('2015/05/15 12:00', 'yyyy/mm/dd hh24:mi')
在我的 java 代码中,我尝试让用户选择一个日期(日期对象是 java.util.date):
DateFormat formater = new SimpleDateFormat("DD-MM-YYYY HH:mm", Locale.FRENCH);
String dateString;
dateString = sc.nextLine();
Date upperDate = formater.parse(dateString);
// a "lowerDate is also that way.
List<Train> listTrains = new ArrayList<>();
listTrains = manager.WhenTrain(departure_city, arrival_city, upperDate, lowerDate);
for(int i = 0; i<liste.size(); i++)
{
System.out.println(listTrains.get(i));
}
在一个方法中,我尝试获取对应于各种条件的值,其中包括日期,所以我有:
在构造函数和字段中:
private PreparedStatement AllTrains;
private PreparedStatement LookForDepartureStation;
AllTrains = connection.prepareStatement("SELECT * FROM Trains"
+ "WHERE departure = ? AND arrival = ? AND departurehour BETWEEN ? AND ?"); // Trains is a view, joining several table
LookForDepartureStation = connection.prepareStatement("SELECT * from Journey where departure = ?");
另一种方法:
public List<Train> WhenTrain(String departureStation, String arrivalStation, java.util.Date dateBefore, java.util.Date dateAfter) {
ArrayList<Train> TrainList= new ArrayList<>();
try {
java.sql.Date begin = new java.sql.Date(dateBefore.getTime());
java.sql.Date end = new java.sql.Date(dateAfter.getTime());
LookForDepartureStation.setString(1, departureStation);
ResultSet test1 = LookForDepartureStation.executeQuery();
if(test1.next()){
LookForDepartureStation.close();
LookForArrivalStation.setString(1, arrivalStation);
ResultSet test2 = LookForArrivalStation.executeQuery();
if(test2.next()) {
LookForArrivalStation.close();
AllTrains.setString(1, departureStation);
AllTrains.setString(2, arrivalStation);
AllTrains.setDate(3, begin);
AllTrains.setDate(4, end);
ResultSet rs = AllTrains.executeQuery();
while(rs.next()){
TrainList.add(new Train(rs.getInt(1),
rs.getString(2), rs.getString(3), rs.getDate(4), rs.getDate(5)));
// Train is an object to take all those.
// AllTrains contains TrainID (an oracle integer), departure (varchar2), arrival (varchar2), departurehour (sql oracle DATE), arrivalhour (sql oracle DATE)
}
// AllTrains.close();
return ListeTrains;
}
else {
System.out.println("wrong input on arrival station");
// AllTrains.close();
TrainApp.Alltrains(this);
return TrainList;
}
}
else {
System.out.println("wrong input on departure station");
return TrainList;
}
} catch (SQLException error) {
error.printStackTrace();
return TrainList;
}
catch(NullPointerException e) {
System.out.println("Station not found");
e.printStackTrace();
TrainApp.Alltrains(this); // calling back static method to try again the input.
return TrainList;
}
}
当我尝试在方法中传递 Upperdate 时,调试器显示变量包含:“1 janv.0003 00:00:00”(实际上我尝试使用 03-11-1993)。此外,我认为它不会将我想要的日期放入 Train 对象中,我想我也搞砸了。
程序结束时没有显示列表中的内容(方法调用后的说明,如您在此处的第二个代码引用中所见)。
在不知道 upperDate 和 lowerDate 的值的情况下,很难理解为什么它们没有被正确解析。
查询的问题是 java.sql.Date
将输入中的 java.util.Date
值四舍五入到天,即它重置了时间部分。如果要查询和检索包含时间部分的正确结果,则必须使用 java.sql.TimeStamp
。尝试将 begin
和 end
类型更改为 java.sql.TimeStamp
并将 rs.getDate(4), rs.getDate(5)
更改为 rs.getTimestamp(4), rs.getTimestamp(5)
误解通常是因为Oracle中的日期类型也包含时间部分,但在其他RDBMS中日期类型表示"only"一个日期
我在处理程序中不同格式的日期时遇到问题。
就像现在一样,我的查询已执行,但我以 YYYY-MM-DD 格式从数据库中获取日期。 我希望它们采用 DD-MM-YYYY HH:mm 格式。
在 SQL 文件中,日期定义如下(在 INSERT INTO 指令中):
to_date('2015/05/15 12:00', 'yyyy/mm/dd hh24:mi')
在我的 java 代码中,我尝试让用户选择一个日期(日期对象是 java.util.date):
DateFormat formater = new SimpleDateFormat("DD-MM-YYYY HH:mm", Locale.FRENCH);
String dateString;
dateString = sc.nextLine();
Date upperDate = formater.parse(dateString);
// a "lowerDate is also that way.
List<Train> listTrains = new ArrayList<>();
listTrains = manager.WhenTrain(departure_city, arrival_city, upperDate, lowerDate);
for(int i = 0; i<liste.size(); i++)
{
System.out.println(listTrains.get(i));
}
在一个方法中,我尝试获取对应于各种条件的值,其中包括日期,所以我有:
在构造函数和字段中:
private PreparedStatement AllTrains;
private PreparedStatement LookForDepartureStation;
AllTrains = connection.prepareStatement("SELECT * FROM Trains"
+ "WHERE departure = ? AND arrival = ? AND departurehour BETWEEN ? AND ?"); // Trains is a view, joining several table
LookForDepartureStation = connection.prepareStatement("SELECT * from Journey where departure = ?");
另一种方法:
public List<Train> WhenTrain(String departureStation, String arrivalStation, java.util.Date dateBefore, java.util.Date dateAfter) {
ArrayList<Train> TrainList= new ArrayList<>();
try {
java.sql.Date begin = new java.sql.Date(dateBefore.getTime());
java.sql.Date end = new java.sql.Date(dateAfter.getTime());
LookForDepartureStation.setString(1, departureStation);
ResultSet test1 = LookForDepartureStation.executeQuery();
if(test1.next()){
LookForDepartureStation.close();
LookForArrivalStation.setString(1, arrivalStation);
ResultSet test2 = LookForArrivalStation.executeQuery();
if(test2.next()) {
LookForArrivalStation.close();
AllTrains.setString(1, departureStation);
AllTrains.setString(2, arrivalStation);
AllTrains.setDate(3, begin);
AllTrains.setDate(4, end);
ResultSet rs = AllTrains.executeQuery();
while(rs.next()){
TrainList.add(new Train(rs.getInt(1),
rs.getString(2), rs.getString(3), rs.getDate(4), rs.getDate(5)));
// Train is an object to take all those.
// AllTrains contains TrainID (an oracle integer), departure (varchar2), arrival (varchar2), departurehour (sql oracle DATE), arrivalhour (sql oracle DATE)
}
// AllTrains.close();
return ListeTrains;
}
else {
System.out.println("wrong input on arrival station");
// AllTrains.close();
TrainApp.Alltrains(this);
return TrainList;
}
}
else {
System.out.println("wrong input on departure station");
return TrainList;
}
} catch (SQLException error) {
error.printStackTrace();
return TrainList;
}
catch(NullPointerException e) {
System.out.println("Station not found");
e.printStackTrace();
TrainApp.Alltrains(this); // calling back static method to try again the input.
return TrainList;
}
}
当我尝试在方法中传递 Upperdate 时,调试器显示变量包含:“1 janv.0003 00:00:00”(实际上我尝试使用 03-11-1993)。此外,我认为它不会将我想要的日期放入 Train 对象中,我想我也搞砸了。
程序结束时没有显示列表中的内容(方法调用后的说明,如您在此处的第二个代码引用中所见)。
在不知道 upperDate 和 lowerDate 的值的情况下,很难理解为什么它们没有被正确解析。
查询的问题是 java.sql.Date
将输入中的 java.util.Date
值四舍五入到天,即它重置了时间部分。如果要查询和检索包含时间部分的正确结果,则必须使用 java.sql.TimeStamp
。尝试将 begin
和 end
类型更改为 java.sql.TimeStamp
并将 rs.getDate(4), rs.getDate(5)
更改为 rs.getTimestamp(4), rs.getTimestamp(5)
误解通常是因为Oracle中的日期类型也包含时间部分,但在其他RDBMS中日期类型表示"only"一个日期