2012-04-13 11 views
5

मैं दिनांक प्रकार के लिए निम्न स्ट्रिंग "2012-04-13 04:08:42.794" कन्वर्ट करने के लिए कोशिश कर रहा हूँ:जावा तारीख सरल दिनांक स्वरूप के साथ रूपांतरण में मिलीसेकेंड संरक्षण नहीं है

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS"); 

    Date convertedDate; 
    try { 
     convertedDate = dateFormat.parse(dateString); 
     System.out.println(" in utils: "+convertedDate.toString()); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
     return null; 
    } 


    //----------------- i think this is the problem 
java.sql.Date sqlDate = new java.sql.Date(convertedDate.getTime()); 
     System.out.println("sql: "+sqlDate.toString()); 
     return sqlDate; 

लेकिन इस निम्नलिखित प्रिंट कर रहा है:

in utils: Fri Apr 13 04:08:42 PDT 2012 

मिलीसेकंड को संरक्षित करने के लिए मैं इस तारीख को कैसे प्राप्त कर सकता हूं?

+0

एफवाईआई, परेशानी पुरानी डेट-टाइम कक्षाएं जैसे कि ''java.util.Date'] (https://docs.oracle.com/javase/9/docs/api/java/util/Date.html) , ['java.util.Calendar'] (https://docs.oracle.com/javase/9/docs/api/java/util/Calendar.html), और 'java.text.SimpleDateFormat' अब [विरासत ] (https://en.wikipedia.org/wiki/Legacy_system), [* java.time *] द्वारा प्रदान की गई (https://docs.oracle.com/javase/9/docs/api/java/time/ पैकेज-सारांश.html) जावा 8 और जावा 9 में निर्मित कक्षाएं। [* ट्रायलर * ओरेकल द्वारा देखें] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html)। –

उत्तर

8

का उपयोग convertedDate वस्तु वास्तव में मिलीसेकंड में जानकारी होती है। यहां मुद्दा यह है कि toString() विधि प्रारूप मिलीसेकंड प्रिंट नहीं करता है।

करो

System.out.println(" in utils: " + dateFormat.format(convertedDate)); 

एमएस

System.out.println("millis: " + convertedDate.getTime()); 
+0

मुझे लगता है कि समस्या यह है कि मैं एसक्यूएल तिथि में परिवर्तित करता हूं। क्या यह मिलीसेकंड से छुटकारा पायेगा? – Atma

+0

नहीं, 'DateFormat.parse() '' java.sutil.Date' देता है, न कि' java.sql.Date'। क्या हो रहा है कि 'java.util.Date.toString()' एक प्रारूप का उपयोग करता है जो मिलीसेकंड नहीं दिखाता है, लेकिन डेटा ऑब्जेक्ट में है। प्रिंट्स जो मैंने आपको आपके उत्तर में बताया था और आप मिलीसेकंद जानकारी देखेंगे। http://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html#parse(java.lang.String) – SJuan76

1

वह इसे पर मेरे जाने (तुम्हारा के रूप में एक ही कोड शैली रखने की कोशिश कर) के साथ स्थापित कर रहे हैं, तो आप यह भी देख सकते हैं:

import java.util.*; 
import java.text.*; 
public class main { 
public static void main(String[] args)throws Exception { 
long yourmilliseconds = 1119193190; 
SimpleDateFormat sdf = new SimpleDateFormat("MMM dd,yyyy HH:mm:ss.SSS"); 

Date resultdate = new Date(yourmilliseconds); 
System.out.println(sdf.format(resultdate)); } 
} 

आउटपुट:

Jan 13,1970 17:53:13.190 

सादर, Erwald

1

के बजाय मुद्रण toString का उपयोग कर() आप अपने खुद के मुद्रण विधि कर सकते हैं, तो यह जानकारी आप विशेष रूप से चाहते हैं प्रिंट करता है। यह भी ध्यान रखें कि दिनांक वर्ग का सबसे बहिष्कृत हो गई है - http://docs.oracle.com/javase/6/docs/api/java/util/Date.html

1

tl पर नज़र डालें, डॉ

myPreparedStatetment.setObject( 
    … , 
    LocalDateTime.parse(
     "2012-04-13 04:08:42.794".replace(" " , "T") 
    ) 
) 

विवरण

Answer by SJuan76 सही है: आप की खराब से डिजाइन उत्पादन द्वारा मूर्ख किया जा रहा है Date::toString विधि। इसके बजाय, java.time कक्षाओं का उपयोग करें।

java.time

आधुनिक दृष्टिकोण java.time वर्गों है कि इस तरह Date/Calendar के रूप में परेशानी पुराने तिथि-समय वर्गों का स्थान ले लिया उपयोग करता है।

पहले आईएसओ 8601 मानक का पूर्ण अनुपालन करने के लिए अपनी इनपुट स्ट्रिंग को कन्वर्ट करें। स्पेस को बीच में T के साथ बदलें।

String input = "2012-04-13 04:08:42.794".replace(" " , "T") ; 

पार्स एक LocalDateTime के रूप में के बाद से अपने इनपुट का एक संकेतक का अभाव ऑफसेट-से-यूटीसी या समय क्षेत्र।

LocalDateTime ldt = LocalDateTime.parse(input) ; 

ldt.toString(): 2012-04-13T04: 08: 42।794

एसक्यूएल

तिथि-समय java.sql कक्षाओं से संबंधित से बचें। वे भी java.time कक्षाओं द्वारा आपूर्ति की जाती हैं। जेडीबीसी 4.2 के अनुसार, आप सीधे अपने डेटाबेस के साथ java.time ऑब्जेक्ट्स का आदान-प्रदान कर सकते हैं। तो आप java.sql.Date कक्षा और इसके भयानक हैक किए गए डिज़ाइन के बारे में सभी को भूल सकते हैं।

myPreparedStatement.setObject(… , ldt) ; 

और ...

LocalDateTime ldt = myResultSet.getObject(… , LocalDateTime.class) ; 

नैतिकता

# 1 कहानी का नैतिक: स्मार्ट वस्तुओं का प्रयोग करें, बेवकूफ नहीं तार।

# 2 कहानी का नैतिक: उपयोग केवल java.time वस्तुओं। विरासत दिनांक-समय कक्षाओं से बचें।


बारे java.time

java.time ढांचे जावा 8 और बाद में बनाया गया है। ये कक्षाएं परेशान पुराने legacy दिनांक-समय कक्षाएं जैसे java.util.Date, Calendar, & SimpleDateFormat प्रदान करती हैं।

Joda-Time प्रोजेक्ट, अब maintenance mode में, java.time कक्षाओं में माइग्रेशन की सलाह देता है।

और जानने के लिए, Oracle Tutorial देखें। और कई उदाहरणों और स्पष्टीकरणों के लिए स्टैक ओवरफ़्लो खोजें। विशिष्टता JSR 310 है।

एक JDBC driver अनुरूप JDBC 4.2 साथ या बाद में उपयोग करके आप अपने डाटाबेस के साथ java.time वस्तुओं सीधे का आदान-प्रदान कर सकते हैं। तारों की कोई ज़रूरत नहीं है और न ही java.sql। * कक्षाएं।

जावा.टाइम कक्षाएं कहां प्राप्त करें?

  • Java SE 8, Java SE 9, और बाद में
    • में निर्मित।
    • एक बंडल कार्यान्वयन के साथ मानक जावा एपीआई का हिस्सा।
    • जावा 9 कुछ मामूली विशेषताओं और सुधारों को जोड़ता है।
  • Java SE 6 और Java SE 7
    • java.time कार्यक्षमता की ज्यादातर ThreeTen-Backport में जावा 6 & से 7 वापस भेजा गया है।
  • Android
    • java.time वर्गों के एंड्रॉयड बंडल कार्यान्वयन के बाद के संस्करण।
    • पहले एंड्रॉइड के लिए, ThreeTenABP प्रोजेक्ट थ्रीटेन-बैकपोर्ट (ऊपर उल्लिखित) का अनुकूलन करता है। How to use ThreeTenABP… देखें।

ThreeTen-Extra परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के संभावित भविष्य के जोड़ों के लिए एक सिद्ध भूमि है। आपको यहां कुछ उपयोगी कक्षाएं मिल सकती हैं जैसे Interval, YearWeek, YearQuarter, और more

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