एक बग के बाद, मैंने देखा है कि अगर मैं java.sql.Timestamp को java.util.Date से बनाता हूं, तो कन्स्ट्रक्टर का उपयोग करके जो मिलीसेकंड लेता है, दिनांक उदाहरण हमेशा टाइमस्टैम्प के बाद होता है। यह परेशान है, क्योंकि (ए) पहले() के लिए अनुबंध एक सख्त तुलना निर्दिष्ट करता है और (बी) यदि बराबर नहीं है, तो टाइमस्टैम्प, क्योंकि इसमें नैनोसेकंड हैं, यह तिथि() के बाद हो सकता है। लेकिन परिणाम विपरीत और दोहराने योग्य हैं (जेडीके 1.6 और 1.7 के साथ, विभिन्न जेवीएम टाइमज़ोन के साथ)। दो तिथियों की तुलना सही ढंग से काम करता है, लेकिन किसी तारीख को() या बाद() से पहले कॉल करना और टाइमस्टैम्प तर्क देने से अप्रत्याशित परिणाम होते हैं।java.sql.Timestamp java.util.Date से बनाया गया, हमेशा क्यों पहले()?
नीचे दिए गए नमूना कोड में दो दिनांक और एक टाइमस्टैंप उदाहरण है, उनमें से सभी एक ही मिलीसेकंद मूल्य के साथ हैं। फिर भी एक टाइमस्टैम्प के साथ एक तिथि की तुलना करने से तारीख() Timestamp के बाद होने वाली तारीख दिखाती है।
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?
}
}
नमूना उत्पादन:
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
अंतिम पंक्ति उत्सुक एक है।
धन्यवाद।
इसे इंगित करने के लिए डीबगर का उपयोग करें। और [Timestamp API] को याद दिलाएं (http://docs.oracle.com/javase/6/docs/api/java/sql/Timestamp.html) * "[...] यह अनुशंसा की जाती है कि कोड टाइमस्टैम्प मानों को न देखे सामान्य रूप से java.util.Date के उदाहरण के रूप में। "* – Kai
' d1.compareTo (ts); 'परिणाम' 1', यह दर्शाता है कि 1 नैनो अंतर या पसंद का कुछ है। ___ मुझे विश्वास है कि यह एक बग है, हां। अच्छा काम यह खोज रहा है! – XenoRo