2010-02-23 7 views
9

Ich ziehe Daten aus einer Oracle-Datenbank. Sie werden in einem Feld java.util.Date festgelegt und sie sind in Wirklichkeit java.sql.Timestamp-Instanzen (was eine Unterklasse von Java.util.Date ist). Wenn ich zwei dieser Zeitstempel aus zwei verschiedenen Datenbanksätzen durch Aufrufen von after() am ersten Datum und Vergleiche mit dem zweiten Datum vergleiche, bekomme ich die falsche Antwort, wenn alle Teile des Datums die gleichen sind, mit Ausnahme der Millisekunden.java.util.Timestamp.after() falsch beim Vergleich von Millisekunden?

Alle folgenden Aussagen sollten in „true“ führen, aber der zweite Satz von Zahlen nicht:

firstDate = 1/1/2000 12:00:20:00 
secondDate = 1/1/2000 12:00:10:00 
result = firstDate.after(secondDate); 
result is TRUE <-- EXPECTED RESULT 

firstDate = 1/1/2000 12:00:00:10 
secondDate = 1/1/2000 12:00:00:00 
result = firstDate.after(secondDate); 
result is FALSE <-- NOT EXPECTED, result should be TRUE 

Ich weiß nanos getrennt von der Date-Instanz in der Timestamp-Klasse gespeichert ist, und ich bin gespannt, ob Das ist das Problem.

+0

Drucken Termine Simple um dies zu debuggen verwenden. – kgiannakakis

+2

Bitte poste den eigentlichen Code, keinen Pseudocode. Zweitens gibt es kein 'java.util.Timestamp', meinst du' java.sql.Timestamp'? –

Antwort

4

Sie können sie vergleichen, aber nur durch den Vergleich Millis. Obwohl es ziemlich hässlich ist, scheint es in allen Fällen zu funktionieren (unabhängig davon, was java.sql.Timestamp oder java.util.Date ist).

if(date1.getTime() > date2.getTime()) { 
    //... 
} 
0

Es sieht so aus, als ob das Problem, dass firstDate und secondDate auf Java.util.Date-Objekte gesetzt sind, aber das JavaDoc für java.sql.Timestamp erwähnt, dass es eine Zusammensetzung aus java.util.Date und einem separaten Nanosekunden-Wert ist.

Dies ist, warum es falsch zurückkehrt, wenn Sie versuchen, die beiden zu vergleichen. Wenn Sie FirstDate und SecondDate auf tatsächliche Timestamp-Objekte umgestellt haben, sollten sie funktionieren.

0

ohne den eigentlichen Code ist dies eine Spekulation, aber ich denke, eines Ihrer Objekte ist java.util.Date und das andere ist java.sql.Timestamp man kann sie nicht wirklich vergleichen, da das millis Feld in ‚Timestamp‘ abgeschnitten wird zu einem zweiten und der Rest gespeichert in nanos Feld. Es ist wirklich bedauerlich, dass Timestamp eine Unterklasse von Date ist. Dies führt definitiv zu einem Problem, das Sie erleben.

BEARBEITEN.

Eine weitere Möglichkeit ist, dass Ihr DB-Treiber eine eigene Unterklasse von Timestamp zurückgibt. Da die Klasse nicht endgültig ist, ist es durchaus möglich, dass ihre Implementierung Timestamps compare vermasselt hat, nicht dass es besonders schwierig ist.

+0

Sie sind beide java.sql.Timestamp-Instanzen. – BestPractices

2

Der Schlüssel zu dem Problem hier ist, wenn die Timestamps zu Date-Objekten umgewandelt werden. Die nach Methode von Date wird anstelle der nach Methode in Timestamp verwendet. Wenn nicht nach Datum umgewandelt wird, funktioniert die nach Methode von Timestamp ordnungsgemäß.

Ich denke, ich brauche jetzt eine Lektion auf covariant method parameters, warum die nach Methode in Timestamp im folgenden Code nicht aufgerufen wird.

java.sql.Timestamp one = new java.sql.Timestamp(1266873627200L); 
    java.sql.Timestamp two = new java.sql.Timestamp(1266873627000L); 

    java.util.Date oneDate = (java.util.Date) one; 
    java.util.Date twoDate = (java.util.Date) two; 


    System.out.println("one: " + oneDate.getTime()); 
    System.out.println("two: " + twoDate.getTime()); 

    if (oneDate.after(twoDate)) { 
     System.out.println(oneDate.getTime() + " after " + twoDate.getTime()); 
    } else { 
     System.out.println(twoDate.getTime() + " after " + oneDate.getTime()); 
    } 

Ergebnisse

one: 1266873627200 
two: 1266873627000 
1266873627000 after 1266873627200 
Verwandte Themen