जवाबों:
द्वारा Timestamp
, मुझे लगता है आप मतलब है java.sql.Timestamp
। आप देखेंगे कि इस वर्ग के पास एक रचनाकार है जो एक long
तर्क को स्वीकार करता है । आप DateFormat
कक्षा का उपयोग करके इसे पार्स कर सकते हैं :
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
java.util.Date
, java.util.Calendar
और java.text.SimpleDateFormat
अब कर रहे हैं विरासत , द्वारा का स्थान ले लिया java.time जावा 8 और बाद में बनाया गया वर्गों। ओरेकल द्वारा ट्यूटोरियल देखें ।
इस बारे में क्या?
java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
आपका क्या मतलब है टाइमस्टैम्प? यदि आप यूनिक्स युग के बाद से मिलीसेकंड का मतलब:
GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();
यदि आप एक वास्तविक java.sql.Timestamp ऑब्जेक्ट चाहते हैं:
Timestamp ts = new Timestamp(millis);
Calendar.SEPTEMBER
java.sql.Timestamp.from (
LocalDate.of ( 2007 , 9 , 23 )
.atStartOfDay( ZoneId.of ( "America/Montreal" ) )
.toInstant()
)
जावा 8 और बाद में निर्मित java.time फ्रेमवर्क का उपयोग करके कोड दिखाते हुए इस पृष्ठ को अपडेट करते हैं।
ये नई कक्षाएं जेएसआर 310 द्वारा परिभाषित जोडा-टाइम से प्रेरित हैं , और थ्रीटेन-एक्स्ट्रा प्रोजेक्ट द्वारा विस्तारित हैं । वे कुख्यात परेशान करने वाले पुराने डेट-टाइम क्लासेस को जावा के शुरुआती संस्करणों के साथ दबा देते हैं।
Java.time में, Instant
UTC में समय रेखा पर एक क्षण है। ए ZonedDateTime
एक समय क्षेत्र ( ZoneId
) में समायोजित एक त्वरित है ।
यहां समय क्षेत्र महत्वपूर्ण है। की एक तारीख September 23, 2007
नहीं कर सकते एक समय क्षेत्र लागू किए बिना समय रेखा पर एक पल के लिए अनुवाद किया जा। गौर कीजिए कि मॉन्ट्रियल की तुलना में पेरिस में एक नया दिन पहले आया था, जहां यह अभी भी "कल" है।
इसके अलावा, एक java.sql.Timestamp दिन और समय दोनों का प्रतिनिधित्व करता है। इसलिए हमें तारीख के साथ जाने के लिए एक दिन का समय निर्धारित करना चाहिए। हम मानते हैं कि आप दिन के पहले क्षण को दिन के समय के रूप में चाहते हैं। ध्यान दें कि यह हमेशा 00:00:00.0
डेलाइट सेविंग टाइम और संभवतः अन्य विसंगतियों के कारण समय नहीं है ।
ध्यान दें कि पुराने java.util.Date वर्ग के विपरीत, और Joda-Time के विपरीत, java.time के प्रकारों में मिलीसेकंड के बजाय नैनोसेकंड का रिज़ॉल्यूशन होता है। यह java.sql.Timestamp के रिज़ॉल्यूशन से मेल खाता है।
ध्यान दें कि java.sql.Timestamp को अपनी toString
पद्धति के माध्यम से एक स्ट्रिंग प्रतिनिधित्व उत्पन्न करते समय अपने JVM के वर्तमान डिफ़ॉल्ट समय क्षेत्र को अपने दिनांक-समय मान पर लागू करने की एक बुरी आदत है । यहां आप मेरा America/Los_Angeles
समय क्षेत्र लागू होते देखें। इसके विपरीत, मानक आईएसओ 8601 स्वरूपों का उपयोग करके java.time कक्षाएं अधिक समझदार हैं ।
LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.atStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ) ;
सांत्वना देना।
System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );
जब चला।
d: 2007-09-23 = zdt: 2007-09-23T00: 00-04: 00 [अमेरिका / मॉन्ट्रियल] = तत्काल: 2007-09-23T04: 00: 00Z = ts: 2007-09-22 21:00: 00.0
वैसे, JDBC 4.2 के रूप में, आप सीधे java.time प्रकारों का उपयोग कर सकते हैं। की कोई जरूरत नहीं java.sql.Timestamp
।
PreparedStatement.setObject
ResultSet.getObject
Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं परेशानी वर्ष प्रतिस्थापित विरासत जैसे तिथि-समय कक्षाएं java.util.Date
, Calendar
, और SimpleDateFormat
।
Joda समय परियोजना, अब में रखरखाव मोड , प्रवास करने की सलाह देता java.time कक्षाएं।
अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें। विशिष्टता JSR 310 है ।
आप अपने डेटाबेस से सीधे java.time वस्तुओं का आदान-प्रदान कर सकते हैं । JDBC 4.2 या उसके बाद वाले JDBC ड्राइवर का अनुपालन करें । तार की कोई जरूरत नहीं, कक्षाओं की कोई जरूरत नहीं ।java.sql.*
Java.time कक्षाएं कहाँ से प्राप्त करें?
ThreeTen-अतिरिक्त परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के संभावित भविष्य के अतिरिक्त के लिए एक साबित जमीन है। आप यहाँ कुछ उपयोगी वर्गों जैसे मिल सकता है Interval
, YearWeek
, YearQuarter
, और अधिक ।
आप निम्न कार्य भी कर सकते हैं:
// untested
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 23);// I might have the wrong Calendar constant...
cal.set(Calendar.MONTH, 8);// -1 as month is zero-based
cal.set(Calendar.YEAR, 2009);
Timestamp tstamp = new Timestamp(cal.getTimeInMillis());
एपीआई के अनुसार कंस्ट्रक्टर जो वर्ष, महीने और इतने पर स्वीकार करता है, को पदावनत कर दिया जाता है। इसके बजाय आपको कंस्ट्रक्टर का उपयोग करना चाहिए जो लंबे समय से स्वीकार करता है। आप इच्छित तिथि के निर्माण के लिए एक कैलेंडर कार्यान्वयन का उपयोग कर सकते हैं और समय-प्रतिनिधित्व को लंबे समय तक एक्सेस कर सकते हैं, उदाहरण के लिए getTimeInMillin विधि के साथ।
संपूर्णता के लिए, Joda-Time संस्करण 2.5 और उसकी DateTime
कक्षा के साथ एक समाधान भी :
new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
DateTime
ऑब्जेक्ट पर लागू होता है । इसका मतलब है कि आपके परिणाम विभिन्न कंप्यूटरों या होस्ट ओएस या जेवीएम सेटिंग्स के कॉन्फ़िगरेशन में भिन्न होंगे । अनुमानित परिणामों के लिए, उस DateTime
कंस्ट्रक्टर के लिए एक टाइम ज़ोन पास करें । अपने इरादे के लिए उचित समय क्षेत्र का नाम चुनें । उदाहरण के लिए, DateTimeZone.forID( "America/Montreal" )
या DateTimeZone.UTC
।
DateTime
इसके मिलीसेकंड-बाद-युग के लिए वस्तु पूछें । बदलें .toDate().getTime()
के साथ .getMillis()
।
DateTimeZone.getDefault()
वैकल्पिक तर्क के रूप में परिणाम को कॉल और पास करके स्पष्ट रूप से कहें । (वैसे, डिट्टो के लिए Locale.getDefault()
, वैकल्पिक तर्कों की अस्पष्टता पर एक ही मुद्दा।)