java - 如何检查Java日期类型的有效性?

标签 java date-comparison date

我编写了两个简单的函数来获取 MySQL 表中的日期值。开始日期和结束日期列都是Date 数据类型。所以,在我的这两个函数中,它是这样的:

public Date get_startdate(long nodeid,String ts) {
    try {
        String sql="Select STARTDT FROM urllink WHERE URL='f0="+nodeid+"&ts="+ts + "'";
        if (em == null) {
             throw new Exception("could not found URL object.");
        }
        return (Date) em.createNativeQuery(sql).getSingleResult();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

public Date get_enddate(long nodeid,String ts) {
    try {
        String sql="Select ENDDT FROM urllink WHERE URL='f0="+nodeid+"&ts="+ts + "'";
        if (em == null) {
            throw new Exception("could not found URL object.");
        }
        return (Date) em.createNativeQuery(sql).getSingleResult();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

现在我像这样在主页中调用这些函数,我想检查日期条件,如果 URL 位于这两个日期之间,那么它应该有效并执行某些操作。我在下面强调了我的意思:

Date file_getstartdate=fileFacade1.get_startdate(fileID,hash);
Date file_getenddate=fileFacade1.get_enddate(fileID,hash);

String currentDate = CoreUtil.parseDate(new Date());

if( file_getstartdate<= currentDate<= file_getendDate){
    //URL is valid, do something
}else {
    //do nothing
}

我的表中存储的日期格式为YYYY-MM-DD,我面临的问题是在上面的if语句中进行比较。I不能使用这些运算符来进行检查。有没有办法实现我的愿望?

最佳答案

不要使用字符串连接来构造 SQL 查询

这很容易受到 SQL 注入(inject)的攻击,而且非常危险:

String sql="Select STARTDT FROM urllink WHERE URL='f0="+nodeid+"&ts="+ts + "'";
...
return (Date) em.createNativeQuery(sql).getSingleResult();

假设em指的是 EntityManager对象然后你可以构建一个 Criteria基于查询,或者如果您确实需要坚持使用 native SQL,那么您应该使用 PreparedStatement相反。

对于您的比较问题,您遇到三个问题:

  • 您正在尝试比较两种不同的类型( StringDate )。
  • 您尝试使用的运算符只能用于比较基元,而不能用于比较对象 ( <= )。
  • 您将条件编写为数学语句,而不是编程条件语句( a <= b <= c 不是有效的 Java 语句。它需要是 a <= b && b <= c )。

这是一种使用 Date 进行比较的方法类(请注意,由于 Java 8 LocalDate 是一个更好的类,如果您可以选择的话)。

Date fileStartDate = fileFacade1.get_startdate(fileID, hash);
Date fileEndDate = fileFacade1.get_enddate(fileID, hash);

Date currentDate = new Date();

if (fileStartDate.before(currentDate) && fileEndDate.after(currentDate) {
  ...

回复您的评论

Okay but does using preparedStatement helps with this SQL inejction. Does entity manager prevent the injection? I was told not to use preparedstatement,are there any other alternatives?

如果有人告诉您使用字符串连接(代码的 +nodeid++ts + 部分)而不是使用PreparedStatement 进行 native 查询,那么他们就错了。 EntityManager 不会保护您免受上述代码中的注入(inject),但PreparedStatement 以及更改查询的构造方式可以。

PreparedStatement 看起来像这样

String url = "f0=" + nodeid + "&ts=" + ts;
PreparedStatement preparedStatement = connection.prepareStatement("Select STARTDT FROM urllink WHERE URL= ?");
preparedStatement.setString(1, url);
ResultSet resultSet = preparedStatement.executeQuery();

如果您被告知使用 EntityManager而不是编写 native SQL 那么这实际上是一个很好的建议。您需要使用 Criteria 构建查询抽象。如何做到这一点可能是一个单独的问题。

关于java - 如何检查Java日期类型的有效性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55566506/

相关文章:

mysql - sql 日期比较仅在年份为第一时才有效

java - 无法比较时间范围

html - 'datePublished' 属性和 HTML 'lang' 属性

java - 通过JDBC PreparedStatement执行选择时出现“日期格式图片结束..”错误

java - 并行解析来自外部网络提供商的许多 csv

java 使用cmd列出特定包的jar文件中的所有方法和类

jquery - jquery 比较日期

php - 在php中获取当前数据

java - 在 Java 8 中并行使用 BigDecimal 进行分组和求和

java - 为什么多次调用 System.out.println 会在单行中打印值