2013-03-07 104 views
1

我正在使用MVC模式在Java EE中編寫簡單的登錄程序,並且希望提醒用戶他/她的密碼已超過一年。目前我可以從數據庫中獲取數據,並將其轉換爲字符串,但之後我不知道如何將其與當前日期進行比較。如何比較從java當前日期mySQL日期?

這是我到目前爲止有:

public String validateAccount(String email, String enterPassword) { 

     try { 
      Class.forName(driverName).newInstance(); 
     } catch (InstantiationException | IllegalAccessException 
       | ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     Connection connection; 

     try { 

      connection = DriverManager.getConnection(dbURL, username, password); 

      // Retrive current user data from database 
      String getCredentials = "SELECT id,dateSet,strength FROM users WHERE email=? AND hashPassword=SHA2(CONCAT(?, salt), 256)"; 
      PreparedStatement verifyCredentials = connection 
        .prepareStatement(getCredentials); 
      verifyCredentials.setString(1, email); 
      verifyCredentials.setString(2, enterPassword); 
      ResultSet foundData = verifyCredentials.executeQuery(); 

      while (foundData.next()) { 
       System.out.println("Found account"); 
       int id = foundData.getInt("id"); 
       String dateSet = foundData.getString("dateSet"); 
       String strength = foundData.getString("strength"); 

       // ... do something with these variables ... if 
       if (strength.equals("Weak")) { 
        return "1"; 

       } else if (/*Check if the date in the database is over a year old, and return 2*/) { 
        return "2"; 
       } else { 
        return "0"; 
       } 

      } 
      foundData.close(); 

      return "Account not found, re-enter your info again"; 

     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return ""; 

    } 

回答

3

您可以使用foundData.getTimestamp()來代替,並得到一個時間戳,您可以轉換成普通Java數據類:)

所以,你會碰到這樣的

Date dateSet = new Date(foundData.getTimestamp("dateSet").getTime()); 

或另外,如果你不熟悉與Date實例的工作(需要使用日曆以及)可以做檢查直接在您的SQL查詢,

String getCredentials = "SELECT id,dateSet,strength, IF(dateSet < NOW() - INTERVAL 1 YEAR, TRUE, FALSE) AS oldPasswd FROM users WHERE email=? AND hashPassword=SHA2(CONCAT(?, salt), 256)"; 

然後

else if (foundData.getBoolean("oldPasswd")) { 
    return "2"; 
} 
+0

我不與.getTimestamp()方法,或者用一般的日期familizarized的差異。 .getTimestamp返回什麼格式,以及如何轉換它? – 2013-03-07 18:50:34

+0

假設數據庫中的列是DATE類型,那麼gettimestamp將返回一個Timestamp實例,然後可以給你一個long,這是自unixepoc以來的毫秒數。 Date類有一個構造函數,它代表了自unixepoc作爲參數以來的毫秒數,因此您可以獲得日期實例:) – JustDanyul 2013-03-07 18:52:49

+0

您是男人!我認爲它工作。 :D – 2013-03-07 19:05:40

2

試試這個

java.sql.Date date = foundData.getDate("dateSet"); 
java.sql.Date date2 = new Date(System.currentTimeMillis()); 
date2.compareTo(date); 

我只是修改你訪問你的約會形成的結果集的方式。 請注意,如果參數Date等於此Date,則「compareTo」將返回值0;如果此日期在Date參數之前,則值小於0;如果此Date在Date參數之後,則值大於0。

下面的方法將讓你在天

public static long daysBetween(Date sd, Date ed) { 
    Calendar startDate = Calendar.getInstance(); 
    startDate.setTime(sd); 
    Calendar endDate = Calendar.getInstance(); 
    startDate.setTime(ed); 
    Calendar date = (Calendar) startDate.clone(); 
    long daysBetween = 0; 
    while (date.before(endDate)) { 
     date.add(Calendar.DAY_OF_MONTH, 1); 
     daysBetween++; 
    } 
    return daysBetween; 
} 
+0

我明白,但一旦我得到兩個日期,我如何檢查是否有365天(1年)或更多的差異? – 2013-03-07 18:54:58

+0

更新了我的答案,它會給你在日曆 – kunal 2013-03-07 19:08:29

+0

+1的差異的方法:) – JustDanyul 2013-03-07 19:16:30