在发现错误之后,我注意到如果我从java.util.Date创建一个java.sql.Timestamp,使用占用毫秒的构造函数,则Date实例总是在()时间戳之后.这是令人费解的,因为(a)before()的合同指定了严格的比较,(b)如果不相等,Timestamp,因为它有纳秒,可能本身就是在Date之后.但结果是相反且可重复的(使用JDK 1.6和1.7,具有不同的JVM时区).比较两个日期可以正常工作,但在Date上调用before()或after()并给出Timestamp参数会产生意外结果.
下面的示例代码有两个Date和一个Timestamp实例,所有这些实例都具有相同的毫秒值.然而,将Date与Timestamp进行比较会显示Date之后()时间戳.
import java.util.Date;
import java.sql.Timestamp;
public class X extends Date {
public static void main(String[] args) {
Date d1 = new Date();
Date d2 = new Date(d1.getTime());
Timestamp t = new Timestamp (d1.getTime());
System.out.println ("date1 = " + d1 + " (" + d1.getTime() + ")" );
System.out.println ("date2 = " + d2 + " (" + d2.getTime() + ")" );
System.out.println ("timestamp = " + t + " (" + t.getTime() + ")" );
System.out.println ("d1 before d2: " + d1.before(d2));
System.out.println ("d1 after d2: " + d1.after(d2));
System.out.println ("d1 before ts: " + d1.before(t));
System.out.println ("d1 after ts: " + d1.after(t)); //why true?
}
}
Run Code Online (Sandbox Code Playgroud)
样本输出:
C:\>\Java\jdk1.7.0_05\bin\java X
date1 = Tue Oct 30 10:15:59 EDT 2012 (1351606559812)
date2 = Tue Oct 30 10:15:59 EDT 2012 (1351606559812)
timestamp = 2012-10-30 10:15:59.812 (1351606559812)
d1 before d2: false
d1 after d2: false
d1 before ts: false
d1 after ts: true
Run Code Online (Sandbox Code Playgroud)
最后一行是好奇的.
谢谢.
如果您查看内部表示以及after()方法中的比较,您会看到例如for
millis = 1351607849957
Run Code Online (Sandbox Code Playgroud)
你会得到一个Date与
fastTime = 1351607849957
Run Code Online (Sandbox Code Playgroud)
和Timestamp用
fastTime = 1351607849000
nanos = 957000000
Run Code Online (Sandbox Code Playgroud)
由于所有比较的是fastTime部分,因此您可以获得观察到的行为.正如@ user714965指出的那样,你不应该把a Timestamp当作一个Date.
| 归档时间: |
|
| 查看次数: |
20735 次 |
| 最近记录: |