2012-10-13 13 views
5

मेरे पास एक साधारण इकाई वर्ग है जिसमें दिनांक संपत्ति है। यह संपत्ति एक MySQL डेटाटाइम कॉलम से मेल खाती है।डेटाबेस में निरंतर तिथि पुनर्प्राप्त तिथि के बराबर नहीं है

java.util.Date now = new java.util.Date(); 
Entity entity = new Entity(); 
entity.setStartDate(now); 
entityService.save(entity); // save entity to database 
entity = entityService.get(entity.getId()); // get entity back from database 
Assert.assertEquals(entity.getStartDate(), now); 

मैं उन दो तिथियों के बराबर होने की अपेक्षा करेंगे, लेकिन वे नहीं कर रहे हैं:

@Entity 
public class Entity { 

    @Column(name = "start_date") 
    @Temporal(TemporalType.TIMESTAMP) 
    private java.util.Date startDate; 

} 

यह वही एकीकरण परीक्षण मैं कैसी लगती है लिखा है! असल में, मेरे पास है:

now.getTime() = 1350160029831 
entity.getStartDate().getTime() = 1350160029000 

इसलिए दो तिथियों के बीच एक छोटा सा अंतर है। मैं वास्तव में सोच रहा हूं कि यह अंतर कहां से आ सकता है। यह हमेशा एक जैसा नहीं होता है और प्रत्येक बार जब मैं परीक्षण प्रक्रिया शुरू करता हूं तो भिन्न होता है। मेरे डेटाबेस में, संग्रहीत दिनांक 2012-10-13 22: 15: 38.0 है।

क्या मुझे वास्तव में कहीं मिलीसेकंड को साफ़ करने की आवश्यकता है?

उत्तर

3

MySQL documentation से:

एक DATETIME या TIMESTAMP मूल्य को माइक्रोसेकंड को (6 अंक) परिशुद्धता में एक अनुगामी आंशिक सेकंड हिस्सा शामिल कर सकते हैं। यद्यपि यह आंशिक भाग पहचाना जाता है, इसे DATETIME या TIMESTAMP कॉलम में संग्रहीत मानों से त्याग दिया जाता है। MySQL में fractional सेकेंड समर्थन के बारे में जानकारी के लिए, खंड 11.1.5.6, " समय मानों में फ्रैक्शनल सेकेंड" देखें।

ध्यान दें कि आप प्रयोग नहीं करना चाहिए वैसे भी तारीखों की तुलना करने के बराबर होती है, क्योंकि विभिन्न दिनांक उपवर्गों गाड़ी कार्यान्वयन, जो इस प्रकार a.equals(b) && !b.equals(a) के रूप में समस्याओं का कारण है:

java.util.Date d1 = java.sql.Date.valueOf("2012-01-01"); 
java.util.Date d2 = new java.util.Date(d1.getTime()); 
java.util.Date d3 = new java.sql.Timestamp(d1.getTime()); 

System.out.println(d1.equals(d2)); // true 
System.out.println(d2.equals(d1)); // true 
System.out.println(d1.equals(d3)); // true 
System.out.println(d3.equals(d1)); // false 
System.out.println(d2.equals(d3)); // true 
System.out.println(d3.equals(d2)); // false 
+0

तो मैं मिलीसेकेंड भाग से छुटकारा GED चाहिए इस तरह कुछ के साथ: कैलेंडर कैलेंडर = कैलेंडर.getInstance(); कैलेंडर.सेटटाइम (दिनांक); कैलेंडर.सेट (कैलेंडर। मिलिसेकोन्ड, 0); – Tunaki

संबंधित मुद्दे