处理日期 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。尝试将 beginend 类型更改为 java.sql.TimeStamp 并将 rs.getDate(4), rs.getDate(5) 更改为 rs.getTimestamp(4), rs.getTimestamp(5)

误解通常是因为Oracle中的日期类型也包含时间部分,但在其他RDBMS中日期类型表示"only"一个日期