2013-03-07 3 views
1

Я пишу простую программу входа в Java EE с использованием шаблона MVC, и я хочу предупредить пользователя о том, что его/ее пароль старше года. В настоящее время я могу получить данные из базы данных и преобразовать их в строку, но после этого я не знаю, как сравнить ее с текущей датой.Как сравнить дату с mySQL с текущей датой в java?

Это то, что я до сих пор:

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 Data :)

Таким образом, вы бы что-то вроде

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

или в качестве альтернативы, если вы не знакомы с работой с экземплярами Дата (вы должны будете использовать календарь, а) вы можете сделать чек непосредственно в Ваш 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

Я не familizarized с методом .getTimestamp() или с датами в целом. Какой формат возвращал .getTimestamp и как его преобразовать? –

+0

Работая в предположении, что столбец в базе данных является типом DATE, тогда gettimestamp вернет экземпляр метки времени, который затем может дать вам длинный, который является числом миллисекунд с момента создания unixepoc. Класс Date имеет конструктор, который занимает длинное число миллисекунд, поскольку unixepoc как параметр, так что вы получите экземпляр даты :) – JustDanyul

+0

Вы, мужчина! Я думаю, это сработало. : D –

2

попробовать этот

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

Я просто модифицированный так, как вы обращались дата формирования результирующего. Обратите внимание, что «compareTo» вернет значение 0, если аргумент Date равен этой дате; значение меньше 0, если эта дата предшествует аргументу Date; и значение больше 0, если эта дата после аргумента Date.

Следующий метод поможет вам разницу в днях

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 год) или больше? –

+0

обновил мой ответ методом, который даст вам разницу в днях – kunal

+0

+1 для примера календаря :) – JustDanyul

Смежные вопросы