1

我正在使用 MVC 模式在 Java EE 中编写一个简单的登录程序,我希望提醒用户他/她的密码已超过一年。目前我可以从数据库中获取数据,并将其转换为字符串,但之后我不知道如何将其与当前日期进行比较。

这是我到目前为止所拥有的:

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 "";

    }
4

2 回答 2

3

您可以改用 foundData.getTimestamp() 并获取时间戳,您可以将其转换为普通的 java Data 类:)

所以,你会有类似的东西

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";
}
于 2013-03-07T18:43:38.383 回答
2

尝试这个

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

我刚刚修改了您从结果集中访问日期的方式。请注意,如果参数 Date 等于此 Date,“compareTo”将返回值 0;如果此 Date 在 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;
}
于 2013-03-07T18:48:01.130 回答