Hello I have a code snippet like this:
Date d1 = new java.sql.Timestamp(new Date().getTime());
Thread.sleep(10);
Date d2 = new java.sql.Timestamp(new Date().getTime());
System.out.println("Date1: " + d1);
System.out.println("Date2: " + d2);
System.out.println("Comparing times d1.t < d2.t: " + (d1.getTime() < d2.getTime()));
System.out.println("Comparing dates d1.before(d2): " + (d1.before(d2)));
The output looks like this:
Date1: 2013-03-26 11:04:01.093
Date2: 2013-03-26 11:04:01.103
Comparing times d1.t < d2.t: true
Comparing dates d1.before(d2): false
What's wrong with this java.sql.Timestamp class?
Yes, I have seen this:
Note: This type is a composite of a java.util.Date and a separate nanoseconds value. Only integral seconds are stored in the java.util.Date component. The fractional seconds - the nanos - are separate. The Timestamp.equals(Object) method never returns true when passed a value of type java.util.Date because the nanos component of a date is unknown. As a result, the Timestamp.equals(Object) method is not symmetric with respect to the java.util.Date.equals(Object) method. Also, the hashcode method uses the underlying java.util.Date implementation and therefore does not include nanos in its computation.
Due to the differences between the Timestamp class and the java.util.Date class mentioned above, it is recommended that code not view Timestamp values generically as an instance of java.util.Date. The inheritance relationship between Timestamp and java.util.Date really denotes implementation inheritance, and not type inheritance.
But it's for Date <-> Timestamp relation.
In my example I have Timestamps only, and still the behavior is unexpected..
UPDATE: ANSWER
The reason this happens is that before()
method is overloaded, not overriden in java.sql.Timestamp
.
I was expecting an 'override' behavior.
The correct way to compare timestamps is to have Timestamp variables, not Dates.
This is still a poor design decision in the Java core, since inheritance should mean Timestamp is-a Date, with no penalties and exceptions..
toString. Formats a timestamp in JDBC timestamp escape format. yyyy-mm-dd hh:mm:ss.
When comparing two TIMESTAMP WITH TIME ZONE values, the comparison is made using the UTC representations of the values. Two TIMESTAMP WITH TIME ZONE values are considered equal if they represent the same instance in UTC, regardless of the time zone offsets that are stored in the values. For example, '1999-04-15-08.00.
Java SQL Timestamp getTime() function with examplesThe function is used to get the time of the Timestamp object. The function returns time in milliseconds which represents the time in milliseconds after 1st January 1970.
Try to use Timestamp
instead of Date
and it will work.
Timestamp d1 = new java.sql.Timestamp(new Date().getTime());
Timestamp
and Date
both have own implementation of method before
. Check it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With