2016-06-17 8 views
6

मेरे पास ऑरैक टेबल में टाइमस्टैम्प कॉलम है। समय संग्रहित करते समय मैं इसे इस कॉलम में यूटीसी में संग्रहीत करता हूं। इस टाइम स्टैम्प को पुनः प्राप्त करने के लिए मैं स्प्रिंग के जेडीबीसी टेम्पलेट का उपयोग कर रहा हूं, जबकि टाइमस्टैम्प टाइप ऑब्जेक्ट देता है।जावा में अपेक्षित टाइमज़ोन में ऑरैकल टाइमस्टैम्प कॉलम को कैसे पुनर्प्राप्त करें?

मैं वर्तमान समय क्षेत्र में "डीडी-एमएम-वाईवायवाई एचएच: मिमी: एसएस" प्रारूप में दिनांक समय स्ट्रिंग प्राप्त करना चाहता हूं। आदेश में प्राप्त करने के लिए है कि मैं कोड निम्नलिखित कोशिश कर रहा हूँ:

new LocalDateTime(<retrieved TimeStamp>, <current user DateTimeZone>).toString("yyyy-MM-dd HH:mm:ss") 

दोनों LocalDateTime और DateTimeZone Joda पुस्तकालय से।

यह अपेक्षा के अनुसार कभी भी काम नहीं कर रहा है। कोड के ऊपर वर्तमान उपयोगकर्ता के समय क्षेत्र के बजाय मुझे केवल यूटीसी में दिनांक समय स्ट्रिंग देता है।

मुझे क्या याद आ रही है?

+0

LocalDateTime आप यहाँ instantiating रहे हैं के लिए पूरी तरह से योग्य वर्ग नाम क्या है? मैं जो भी कर रहा हूं उसके जैसा कोई दस्तावेज ढूंढने में असमर्थ हूं। –

+0

मेरा बुरा। विवरण में अद्यतन किया गया। यह जोडा पुस्तकालय से है। –

उत्तर

2

तो JDBC ड्राइवर डिफ़ॉल्ट सिस्टम समय क्षेत्र के बजाय इस कैलेंडर समय क्षेत्र का उपयोग कर सकते हैं, जब डेटाबेस से टाइमस्टैम्प प्राप्त करने में कठिनाई यूटीसी कैलेंडर जोड़ें।

//Assign utc calendar 
Calendar utc= Calendar.getInstance(); 
utc.setTimeZone(TimeZone.getTimeZone("UTC")); 
Timestamp timestamp = rs.getTimestamp("timestampcolumn", utc); 
//Convert to client date time 
DateTime dateTime = new DateTime(timestamp.getTime(), DateTimeZone.forID("Asia/Kolkata")); 
//Format 
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-YYYY HH:mm:ss"); 
//Change to client wall clock time 
LocalDateTime localDateTime = dateTime.toLocalDateTime(); 
String formattedlocalDateTime = formatter.print(localDateTime) 

उदाहरण

String utcTime = "2016-06-17 14:22:02Z"; 
DateTimeFormatter parser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ssZ"); 
DateTime dateTime = parser.parseDateTime(utcTime).withZone(DateTimeZone.forID("Asia/Kolkata")); 
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-YYYY HH:mm:ss"); 
System.out.println(dateTime); 
LocalDateTime localDateTime = dateTime.toLocalDateTime(); 
String formattedlocalDateTime = formatter.print(localDateTime); 
System.out.println(formattedlocalDateTime); 
+0

क्या यह दृष्टिकोण आपको सही समय क्षेत्र में दिनांक समय दे रहा है? मैंने कोशिश की और मुझे अभी भी समस्या है। उदाहरण के साथ –

+0

अद्यतन उत्तर। आप अपने मूल्यों को इनपुट कर सकते हैं और देख सकते हैं कि यह आपके लिए काम करता है, – Veeram

+0

उसी कोड के लिए मुझे अपनी मशीन पर निम्नलिखित मान मिल रहे हैं: टाइमस्टैम्प: 2016-06-17 09: 33: 25.0, डेटाटाइम: 2016-06-17T09: 33: 25.000 + 05: 30, स्थानीय दिनांक समय: 2016-06-17T09: 33: 25.000, formatter.print (localDateTime): 17-06-2016 09:33:25। मैंने समय क्षेत्र के रूप में "एशिया/कोलकाता" का उपयोग किया है। –

4

मुझे लगता है कि आपका एप्लिकेशन java.util.Date का उपयोग कर रहा है जिसमें समय क्षेत्र की जानकारी नहीं है, toString उपयोग स्ट्रिंग बनाते समय JVM के वर्तमान डिफ़ॉल्ट समय क्षेत्र को लागू करता है।

आप से (Using Joda Library)

ZonedDateTime Tokyo = ZonedDateTime.ofInstant (instant,zoneIdTokyo) ; 

समय क्षेत्र तत्काल समायोजित या लागू कर सकते हैं क्षेत्रों

DateTimeZone zone = DateTimeZone.forID("Asia/Tokyo"); 

आप LocalDateTime जो अपरिवर्तनीय वर्ग एक स्थानीय दिनांक और समय (कुछ ही समय का प्रतिनिधित्व करता है का उपयोग कर रहे जोन)

संपादित करें - आप इसको आजमा सकते हैं(मैं इसे परीक्षण नहीं किया)

DateTime udate = new DateTime("2016-05-01T20:10:04", DateTimeZone.UTC); 
System.out.println(udate); 
DateTime zone = udate.plusMillis(10000) 
.withZone(DateTimeZone.forID("Asia/Kolkata")); 
System.out.println(zone); 
+0

यदि आप छोटे कोड स्निपेट प्रदान कर सकते हैं तो मैं बहुत आभारी हूं जो वास्तव में टाइमस्टैम्प ऑब्जेक्ट को स्वरूपित स्ट्रिंग में बदल देता है। –

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