2009-07-01 22 views
59

साथ Joda समय का उपयोग कैसे करें मैं एक prepared statementjava.sql.Timestamp

INSERT INTO mst(time) VALUES (?); 

है जहां समय एक PostgreSQL डेटाबेस में प्रकार Timestamp की है।
मैं Joda-TimeDateTime ऑब्जेक्ट डाल रहा हूं, या मुझे कहना चाहिए कि मैं कोशिश कर रहा हूं। मुझे डेटटाइम ऑब्जेक्ट को java.sql.Timestamp में कनवर्ट करने का कोई तरीका नहीं मिल सकता है। मैंने जोडा-टाइम दस्तावेज़ पढ़े हैं और इसका कोई संदर्भ नहीं देखा है।

धन्यवाद।

उत्तर

84

आप पहले जोडा डेटटाइम को लंबे समय तक (युग के बाद मिलिस) रूपांतरित कर सकते हैं, और उसके बाद से टाइमस्टैम्प बना सकते हैं।

DateTime dateTime = new DateTime(); 
Timestamp timeStamp = new Timestamp(dateTime.getMillis()); 
+6

टाइमज़ोन घटक के बारे में कहां? आपने दिनांक और समय केवल "कॉपी" किया है, लेकिन टाइमज़ोन नहीं जो वास्तविक मूल्य को प्रभावित कर सकता है ... –

+5

क्या आप इसका मतलब बता सकते हैं? dateTime.getMillis() युग के बाद मिलीसेकंड देता है, जो टाइमज़ोन को ध्यान में रखता है। –

+6

यह ध्यान देने योग्य है कि जोडा-टाइम नैनोसेकंड स्टोर नहीं करता है जबकि टाइमस्टैम्प करता है। दोनों के बीच कोई भी रूपांतरण नैनोसेकंद परिशुद्धता खो देगा। – Gili

9

जोडाटाइम का डेटटाइम कन्स्ट्रक्टर अब आपके लिए इसे संभाल सकता है। (मुझे यकीन है कि अगर सच था जब प्रश्न पोस्ट किया गया था नहीं कर रहा हूँ, लेकिन यह एक शीर्ष गूगल परिणाम तो मैं मैं एक नए समाधान जोड़ा जाने लगा है।)

कुछ एपीआई विकल्प है:

public DateTime(Object instant); 
public DateTime(Object instant, DateTimeZone zone); 

दोनों विकल्प java.sql.Timestamp स्वीकार करते हैं क्योंकि यह java.util.Date को बढ़ाता है, लेकिन नैनोसेकंड को अनदेखा कर दिया जाएगा (क्योंकि फर्श), दिनांक दिनांक और दिनांक में केवल मिलीसेकंद रिज़ॉल्यूशन * है। एक विशिष्ट टाइमज़ोन के बिना यह डेटटाइमज़ोन.यूटीसी पर डिफ़ॉल्ट होगा।

< डिडैक्टिक मोड >
"समाधान" कितने अंक प्रदान किए जाते हैं। "प्रेसिजन" प्रतिनिधित्व कितना सटीक है। उदाहरण के लिए, एमएसएसक्यूएल के डेटटाइम में मिलीसेकंद रिज़ॉल्यूशन है, लेकिन दूसरी परिशुद्धता के केवल ~ 1/3 (डेटटाइम 2 में परिवर्तनीय रिज़ॉल्यूशन और उच्च परिशुद्धता है)।
</उपदेशात्मक मोड >

मिलीसेकंड साथ

यूटीसी टाइमस्टैम्प संकल्प उदाहरण:

new DateTime(resultSet.getTimestamp(1)); 

आप अपने डेटाबेस में समय क्षेत्र के साथ TIMESTAMP का उपयोग कर रहे हैं तो आप java.sql.Timestamp उपयोग नहीं कर सकते, क्योंकि यह समय क्षेत्र का समर्थन नहीं करता है। आपको ResultSet # getString का उपयोग करना होगा और स्ट्रिंग को पार्स करना होगा।

DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss") 
    .parseDateTime(resultSet.getString(1)); 

समय क्षेत्र (ऑफसेट प्रारूप) दूसरा संकल्प उदाहरण के साथ साथ टाइमस्टैम्प:

LocalDateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss") 
    .parseLocalDateTime(resultSet.getString(1)); 

यूटीसी दूसरा संकल्प उदाहरण ** साथ टाइमस्टैम्प:

दूसरा संकल्प उदाहरण ** के साथ समय क्षेत्र के बिना समय-चिह्न **:

DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss Z") 
    .parseDateTime(resultSet.getString(1)); 

बोनस: डेटटाइमफॉर्मैट # के लिए मानक स्थिर सहयोगी पार्स पैटर्न द्वारा पार्सर्स तो आपको करने की ज़रूरत नहीं है।

< उपदेशात्मक मोड >
मैं आम तौर पर आदेश संकल्प स्पष्ट बनाने के लिए और मध्यवर्ती वस्तुओं पैदा करने से बचने के लिए अपने डीबीओ मॉडल में एक स्ट्रिंग का उपयोग करें। (2013-11-14 09:55:25 2013-11-14 के बराबर है 09: 55: 25.000?) मैं आम तौर पर डेटा संरक्षण चिंताओं और "व्यापार मॉडल ऑब्जेक्ट्स" के बीच ऑप्टिमाइज़ करने के लिए "डेटाबेस मॉडल ऑब्जेक्ट्स" के बीच अंतर करने की कोशिश करता हूं जो सेवा स्तर के उपयोग के लिए अनुकूलन/मैपिंग परत के बीच अनुकूलित होता है। मुझे लगता है कि सीआरयूडी आधारित डीएओ व्यवसाय वस्तुओं को उत्पन्न करते हैं, जो प्राथमिकताओं को मिश्रण करने और न तो ऑप्टिमाइज़ करने के लिए सीधे होते हैं, मिस्ड एज मामलों के कारण अप्रत्याशित स्थानों से अपवाद फेंकते हैं। एक स्पष्ट परिवर्तन परत होने पर भी आपको आवश्यकतानुसार सत्यापन जोड़ने की अनुमति मिलती है, जैसे कि आप डेटा स्रोत को नियंत्रित नहीं करते हैं। चिंताओं को अलग करना भी प्रत्येक परत को स्वतंत्र रूप से परीक्षण करना आसान बनाता है।
</उपदेशात्मक मोड >

* यदि आप अपने व्यापार मॉडल में nanosecond समाधान करने के लिए हल करने की जरूरत है आप एक अलग पुस्तकालय का उपयोग करना होगा।

** टाइम्सस्टैम्प स्ट्रिंग प्रारूप डेटाबेस के बीच भिन्न हो सकता है, सुनिश्चित नहीं है।

+0

नैनोसेकंड के संबंध में ... एफवाईआई, [जेएसआर 310: दिनांक और समय एपीआई] (http://jcp.org/en/jsr/detail?id=310) जावा 8 में बनाया जा रहा है, और जोडा-टाइम के उत्तराधिकारी, वास्तव में नैनोसेकंद का समर्थन करते हैं संकल्प। ध्यान रखें कि कई कंप्यूटर की घड़ी उस ग्रैन्युलरिटी में समय नहीं रखती है। इसके अलावा: जेएसआर स्पेक से दिलचस्प नोट: * ये कक्षाएं नैनोसेकंद परिशुद्धता का उपयोग करती हैं। कक्षाओं में ब्रह्मांड की वर्तमान आयु के भीतर किसी भी नैनोसेकंद तत्काल का प्रतिनिधित्व करने के लिए पर्याप्त सटीकता है। * –

+0

मेरी इच्छा है कि वे उस spec में उपन्यास को सही करेंगे ... जावा के हार्डवेयर की परिशुद्धता पर कोई नियंत्रण नहीं है, और सटीकता सटीकता का एक कार्य है और शुद्धता (या 'सत्यता')।कक्षाओं में नैनोसेकंद रेज़ोल्यूशन और स्मृति में पर्याप्त आकार होता है ताकि नैनोसेकंड की एक बड़ी संख्या का प्रतिनिधित्व किया जा सके। – KarlKFI

+0

ग्रैन्युलरिटी के बारे में आपके दावे के लिए: कुछ प्रणालियों में नैनोसेकंद रिज़ॉल्यूशन नहीं होता है, और कुछ में नैनोसेकंड प्रेसिजन या शुद्धता नहीं होती है। System.nanoTime() शायद किसी भी सिस्टम पर शून्य जोड़ता है जहां ऑपरेटिंग सिस्टम नैनोसेकंद रिज़ॉल्यूशन प्रदान नहीं करता है, लेकिन यह केवल संकल्प को बढ़ाता है, सटीकता, शुद्धता या सटीकता नहीं। शब्दावली पर मुझे सबसे अच्छा स्रोत मिल सकता है: http://www.tutelman.com/golf/measure/precision.php – KarlKFI

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