我想比较两个日期。第一个日期是从系统日期检索到的,另一个是我通过一个查询获得的。但是这里的问题是两个日期都是我能看到的相同,但在If else函数中我得到了不同的结果。下面是我的代码和输出部分我已经给出了哪些输出将带有各自的功能?
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date currdate = new Date();
System.out.println("****"+dateFormat.format(currdate));
输出为: - 2014-01-21
stat = con.prepareStatement("select date from finaltbale where tl_id='"+tempmaxid+"'");
rs = stat.executeQuery();
rs.next();
Date tempdate = rs.getDate(1);
输出为: - 2014-01-21
if(tempdate.equals(currdate)){
System.out.println("Dates are same");
}
else{
System.out.println("Dates are different");
}
输出为: - 日期不同
答案 0 :(得分:3)
您获得的系统日期还包括小时,分钟,秒和毫秒。您只打印年,月,日。因此,当您打印这些内容时它们看起来相同,但是当您将它们与.equals
进行比较时,由于日期的时间部分不同,它将返回false。
您可以格式化日期并比较格式中的字符串以查看它们是否相同
if(dateFormat.format(tempdate).equals(dateFormat.format(currdate))){...}
答案 1 :(得分:0)
我不建议比较字符串,但在这种情况下,您可能希望将if中的equals更改为matches,因为equals与另一个对象进行比较,因此两个日期可能具有相同的值但是它们完全不同,另一方面,匹配与正则表达式相比。
答案 2 :(得分:0)
answer by Java Devil是正确的。
详细说明......
"日期"在Java,JDBC和SQL领域是一个棘手的词。
您正在ResultSet上调用getDate
。这会产生java.sql.Date - 注意中间的sql
! java.sql.Date是一个java.util.Date,调整为UTC / GMT为零时间(00:00:00.000)(无时区偏移)。该调整意味着自纪元变化以来的内部毫秒数。
我假设您的行Date currdate = new Date();
正在使用java.util.Date。混合使用这种SQL和非SQL代码时,应该在这些类上明确指定包。
因此,您要比较一个包含不同毫秒数的对象。
在java.util.Date和java.sql.Date对象上调用getTime()
方法,查看自epoch以来的毫秒数。
顺便说一句,由于java.util.Date和java.sql.Date上的toString
方法在呈现字符串时都应用了JVM的默认时区,因此这很复杂。但是这两个对象实际上都没有时区,只是自1970年以UTC / GMT开始的毫秒数(没有时区偏移)。
在SQL中,要捕获日期和时间,请使用standard TIMESTAMP type或特定数据库提供的专有类型。
Joda-Time 2.3库在这里很有帮助。将java.sql.Date或java.util.Date对象与UTC时区对象一起传递给DateTime构造函数,以清楚地了解您正在努力的值。
java.util.Date date = new java.util.Date( 1390276603054L );
DateTime dateTimeUtc = new DateTime( date, DateTimeZone.UTC );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
跑步时......
2014-01-21T03:56:43.054Z
旁注......
a_horse_with_no_name对问题的评论是正确的:'日期'是数据库中列的可怕的名称。这是我学习SQL最有价值的提示......
SQL标准承诺永远不会在任何标识符中使用尾随下划线
因此,如果您使用尾随下划线命名每个列,您就不必担心与各种数据库中的标准和许多专有扩展所定义的许多关键字和其他标识符冲突。
所以请使用date_
。