जावा टाइमस्टैम्प - मैं दिनांक 23/09/2007 को टाइमस्टैम्प कैसे बना सकता हूँ?


जवाबों:


154

द्वारा 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);

1
सामान्य आईएसओ तिथि प्रारूप yyyy-MM-dd है, अन्यथा महान!
vidstige

1
नया टाइमस्टैम्प (समय); त्रुटि यह है कि इस तरह का कोई भी निर्माणकर्ता जो एक लंबा मूल्य नहीं लेता है :(
भानु शर्मा

1
@ भानु डॉक्स दिखाते हैं कि यह एक लंबा मूल्य लेता है और सही ढंग से काम करने के लिए प्रकट होता है: docs.oracle.com/javase/7/docs/api/java/sql/…
हज़ोक

FYI करें, इस तरह के रूप में बहुत परेशानी पुराने तिथि-समय कक्षाएं java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब कर रहे हैं विरासत , द्वारा का स्थान ले लिया java.time जावा 8 और बाद में बनाया गया वर्गों। ओरेकल द्वारा ट्यूटोरियल देखें ।
बेसिल बोर्के

121

इस बारे में क्या?

java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");

1
टाइमस्टैम्प टाइमस्टैम्प = टाइमस्टैम्प.वल्यूऑफ ("2007-09-23 10: 10: 10.0"); मान दिखा रहा है कि ओएफडी 7 में टाइप टाइमस्टैम्प के लिए अपरिभाषित विधि अपरिहार्य है
आशीष रतन

नया टाइमस्टैम्प (समय); त्रुटि देते हुए कि इस तरह का कोई भी निर्माता जो एक स्ट्रिंग मान नहीं लेता है :(
भानु शर्मा

@ भानु निर्माता मिलिस सेकंड में यूनिक्स समय लेता है। यदि आप किसी स्ट्रिंग से टाइमस्टैम्प प्राप्त करना चाहते हैं, तो स्टैटिक विधि मान का उपयोग करें।
हजोक

4
यह प्रश्न के लिए सबसे अच्छा उत्तर प्रतीत होता है।
हज़ोक

1
सर्वश्रेष्ठ उत्तर में तारीख है, जो कि पदावनत है, इसका उपयोग करने के लिए बुरा अभ्यास है। यह उत्तर बेहतर है। धन्यवाद
Alberici

18

आपका क्या मतलब है टाइमस्टैम्प? यदि आप यूनिक्स युग के बाद से मिलीसेकंड का मतलब:

GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();

यदि आप एक वास्तविक java.sql.Timestamp ऑब्जेक्ट चाहते हैं:

Timestamp ts = new Timestamp(millis);

2
गलत और संकलन नहीं होगा! संकलित त्रुटि: 09 एक अष्टक संख्या है, लेकिन 9 अष्टक की सीमा से बाहर है। तर्क त्रुटि: माह 0-आधारित है, आपको 2007 का
OCTOBER

यदि यह संकलन नहीं है तो मुझे एक तर्क त्रुटि नहीं मिल सकती है। :) गंभीरता से, अच्छा कैच, कार्लोस। मैं पहले पकड़ा गया अष्टक वैसे भी गलत चिपकाता है। :(
मैथ्यू फ्लैशेन

वास्तव में टाइमस्टैम्प कंस्ट्रक्टर आपको
वंचित कर रहा है

@ शिवाकोमुरवेल्ली सभी टाइमस्टैम्प कंस्ट्रक्टर पदावनत नहीं हैं और कम से कम मिलिसेकंड के रूप में लंबे समय तक नहीं लगते हैं, कंस्ट्रक्टर जो तर्क के रूप में तारीख लेता है, उसे पदावनत किया जाता है
कोई नाम नहीं

और इसके लिए एक निरंतरता है (महीने के बजाय = 9):Calendar.SEPTEMBER
गुइल्यूम हस्टा

11

tl; डॉ

java.sql.Timestamp.from (
    LocalDate.of ( 2007 , 9 , 23 )
             .atStartOfDay( ZoneId.of ( "America/Montreal" ) )
             .toInstant()
)

java.time

जावा 8 और बाद में निर्मित java.time फ्रेमवर्क का उपयोग करके कोड दिखाते हुए इस पृष्ठ को अपडेट करते हैं।

ये नई कक्षाएं जेएसआर 310 द्वारा परिभाषित जोडा-टाइम से प्रेरित हैं , और थ्रीटेन-एक्स्ट्रा प्रोजेक्ट द्वारा विस्तारित हैं । वे कुख्यात परेशान करने वाले पुराने डेट-टाइम क्लासेस को जावा के शुरुआती संस्करणों के साथ दबा देते हैं।

Java.time में, InstantUTC में समय रेखा पर एक क्षण है। ए 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, और अधिक


3
मुझे आश्चर्य है कि मैं आपके उत्तर को सही मानने के लिए ओपी या मॉड कैसे प्राप्त कर सकता हूं। स्वीकृत उत्तर इतना पुराना है।
स्टटाक

टाइपो को छोड़कर, बहुत अच्छा। asStartOfDay () atStartOfDay () होना चाहिए।
तुललोचर्गम

@ टुल्लोकगोरम फिक्स्ड। धन्यवाद। FYI करें, स्टैक ओवरफ्लो पर, यदि आप बहुत इच्छुक हैं तो ऐसे संपादन खुद करने के लिए आपका स्वागत है।
बेसिल बोर्क

5

आप निम्न कार्य भी कर सकते हैं:

// 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());

2
गलत: परिणाम की एक System.out.println कोशिश करो! आपको कुछ ऐसा मिलेगा: "2009-10-23 15: 26: 56.171" महीना 0-आधारित है इसलिए 9 अक्टूबर है!
user85421

मुझे पता था कि उन स्थिरांक में से एक शून्य-आधारित था, धन्यवाद। पोस्ट अपडेट की गई।
एलेक्स

1
ओह, और मैंने
एलेक्स

4

एपीआई के अनुसार कंस्ट्रक्टर जो वर्ष, महीने और इतने पर स्वीकार करता है, को पदावनत कर दिया जाता है। इसके बजाय आपको कंस्ट्रक्टर का उपयोग करना चाहिए जो लंबे समय से स्वीकार करता है। आप इच्छित तिथि के निर्माण के लिए एक कैलेंडर कार्यान्वयन का उपयोग कर सकते हैं और समय-प्रतिनिधित्व को लंबे समय तक एक्सेस कर सकते हैं, उदाहरण के लिए getTimeInMillin विधि के साथ।


1

संपूर्णता के लिए, Joda-Time संस्करण 2.5 और उसकी DateTimeकक्षा के साथ एक समाधान भी :

new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())

1
अच्छा जवाब है, लेकिन आप एक महत्वपूर्ण टुकड़ा चूक गए : समय क्षेत्र । यदि आप किसी समय क्षेत्र को छोड़ देते हैं, तो JVM का वर्तमान डिफ़ॉल्ट समय क्षेत्र DateTimeऑब्जेक्ट पर लागू होता है । इसका मतलब है कि आपके परिणाम विभिन्न कंप्यूटरों या होस्ट ओएस या जेवीएम सेटिंग्स के कॉन्फ़िगरेशन में भिन्न होंगे । अनुमानित परिणामों के लिए, उस DateTimeकंस्ट्रक्टर के लिए एक टाइम ज़ोन पास करें । अपने इरादे के लिए उचित समय क्षेत्र का नाम चुनें । उदाहरण के लिए, DateTimeZone.forID( "America/Montreal" )या DateTimeZone.UTC
बेसिल बोर्क

वह कोड ब्रीफ़र हो सकता है। हो और मिलीसेकेंड-since- पारित करने के लिए परिवर्तित करने के लिए java.util.Date की आवश्यकता नहीं है युग । बस DateTimeइसके मिलीसेकंड-बाद-युग के लिए वस्तु पूछें । बदलें .toDate().getTime()के साथ .getMillis()
बेसिल बोर्क

@BasilBourque परिस्थितियों के आधार पर, आप अनुमानित परिणाम होने के लिए समय क्षेत्र को छोड़ना चाह सकते हैं। "आपके वर्तमान समयक्षेत्र में" पूरी तरह से उचित और अनुमानित परिणाम हो सकता है। क्यों एक समय क्षेत्र हार्डकोड, या आप अपने कंप्यूटर पहले से ही एक समय क्षेत्र सेट है जब मैन्युअल रूप से एक समय क्षेत्र सेट करने के लिए उपयोगकर्ताओं से पूछना? निश्चित रूप से मुझे काफी हैरानी होगी अगर मेरे कंप्यूटर पर कोई एप्लिकेशन अमेरिका / मॉन्ट्रियल टाइमज़ोन पर समायोजित तारीखों को आउटपुट करना शुरू कर दे।
डेन कार्टर

@dancarter वैकल्पिक समय क्षेत्र को स्वीकार करने से भ्रम पैदा होता है। चूक (ए) की अस्पष्टता को बढ़ाता है (ए) प्रोग्रामर ने अंतर्निहित डिफ़ॉल्ट पर भरोसा करने का इरादा किया था या (बी) प्रोग्रामर समय क्षेत्र के मुद्दों पर विचार करने में विफल रहा (जैसा कि सभी बहुत आम है)। यदि आप वास्तव में JVM के वर्तमान डिफ़ॉल्ट समय क्षेत्र का उपयोग करना चाहते हैं, तोDateTimeZone.getDefault() वैकल्पिक तर्क के रूप में परिणाम को कॉल और पास करके स्पष्ट रूप से कहें । (वैसे, डिट्टो के लिए Locale.getDefault(), वैकल्पिक तर्कों की अस्पष्टता पर एक ही मुद्दा।)
बेसिल बोर्क

-1

एक अधिक सामान्य उत्तर आयात करना होगा java.util.Date, तब जब आपको timestampवर्तमान तिथि के बराबर सेट करने की आवश्यकता होती है, तो बस इसके बराबर सेट करें new Date()


क्योंकि ** दिनांक ("स्ट्रिंग"); ** वंचित है
आशीष रतन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.