tl; डॉ
java.util.Date.from( // Transfer the moment in UTC, truncating any microseconds or nanoseconds to milliseconds.
Instant.now() ; // Capture current moment in UTC, with resolution as fine as nanoseconds.
)
हालांकि ऊपर उस कोड का कोई मतलब नहीं था। दोनों java.util.Date
और Instant
UTC में एक क्षण का प्रतिनिधित्व करते हैं, हमेशा UTC में। उपरोक्त कोड का समान प्रभाव है:
new java.util.Date() // Capture current moment in UTC.
उपयोग करने के लिए यहां कोई लाभ नहीं है ZonedDateTime
। यदि आपके पास पहले से ही एक है ZonedDateTime
, तो एटीसी को हटाकर यूटीसी को समायोजित करें Instant
।
java.util.Date.from( // Truncates any micros/nanos.
myZonedDateTime.toInstant() // Adjust to UTC. Same moment, same point on the timeline, different wall-clock time.
)
अन्य उत्तर सही
उत्तर द्वारा ssoltanid सही ढंग से अपने विशिष्ट प्रश्न के पते, कैसे एक नए स्कूल java.time वस्तु (परिवर्तित करने के लिए ZonedDateTime
एक पुराने स्कूल के लिए) java.util.Date
वस्तु। Instant
ZonedDateTime से निकालें और पास करें java.util.Date.from()
।
डेटा हानि
ध्यान दें कि आप होगा डेटा नुकसान के रूप में, Instant
पटरियों नैनोसेकंड के बाद से युग जबकि java.util.Date
पटरियों मिलीसेकेंड अवधि के बाद।
आपके प्रश्न और टिप्पणियाँ अन्य मुद्दों को उठाते हैं।
सेवकों को यूटीसी में रखें
आपके सर्वर में आमतौर पर एक सर्वोत्तम अभ्यास के रूप में UTC को अपना होस्ट OS सेट होना चाहिए। जेवीएम इस जावा ओएस सेटिंग को अपने डिफ़ॉल्ट समय क्षेत्र के रूप में चुनता है, जावा कार्यान्वयन में जिसे मैं जानता हूं।
समय क्षेत्र निर्दिष्ट करें
लेकिन आपको जेवीएम के वर्तमान डिफ़ॉल्ट समय क्षेत्र पर कभी भी भरोसा नहीं करना चाहिए। होस्ट सेटिंग को चुनने के बजाय, JVM लॉन्च करते समय एक ध्वज पारित हुआ जो एक और समय क्षेत्र सेट कर सकता है। इससे भी बदतर: किसी भी समय किसी भी ऐप के किसी भी धागे में कोई भी कोड java.util.TimeZone::setDefault
रनटाइम पर उस डिफ़ॉल्ट को बदलने के लिए कॉल कर सकता है!
कैसंड्रा Timestamp
प्रकार
किसी भी सभ्य डेटाबेस और ड्राइवर को स्वचालित रूप से भंडारण के लिए यूटीसी को पारित तिथि को समायोजित करना चाहिए। मैं कैसंड्रा का उपयोग नहीं करता हूं, लेकिन ऐसा लगता है कि तारीख के लिए कुछ अल्पविकसित समर्थन है। प्रलेखन का कहना है कि इसका Timestamp
प्रकार एक ही युग से मिलीसेकंड की एक गिनती है (यूटीसी में 1970 का पहला क्षण)।
आईएसओ 8601
इसके अलावा, कैसंड्रा आईएसओ 8601 मानक प्रारूपों में स्ट्रिंग इनपुट स्वीकार करता है। सौभाग्य से, java.time आईएसओ 8601 प्रारूपों का उपयोग पार्सिंग / जनरेटिंग स्ट्रिंग्स के लिए अपनी चूक के रूप में करता है। Instant
वर्ग ' toString
कार्यान्वयन अच्छी तरह से करेंगे।
परिशुद्धता: मिलेसेकंड बनाम नैनोसेकॉर्ड
लेकिन पहले हमें ZonedDateTime की नैनोसेकंड परिशुद्धता को मिलीसेकंड तक कम करने की आवश्यकता है। एक तरीका यह है कि मिलीसेकंड का उपयोग करके एक नया इंस्टेंट बनाया जाए। सौभाग्य से, java.time को मिलीसेकंड में और उससे परिवर्तित करने के लिए कुछ आसान तरीके हैं।
उदाहरण कोड
यहाँ जावा 8 अपडेट 60 में कुछ उदाहरण कोड है।
ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );
…
Instant instant = zdt.toInstant();
Instant instantTruncatedToMilliseconds = Instant.ofEpochMilli( instant.toEpochMilli() );
String fodderForCassandra = instantTruncatedToMilliseconds.toString(); // Example: 2015-08-18T06:36:40.321Z
या इस कैसंड्रा जावा ड्राइवर डॉक के अनुसार , आप एक java.util.Date
उदाहरण पारित कर सकते हैं (भ्रमित होने की नहीं java.sqlDate
)। तो आप instantTruncatedToMilliseconds
ऊपर के कोड में उस से एक जडेट बना सकते हैं ।
java.util.Date dateForCassandra = java.util.Date.from( instantTruncatedToMilliseconds );
यदि अक्सर ऐसा करते हैं, तो आप एक-लाइनर बना सकते हैं।
java.util.Date dateForCassandra = java.util.Date.from( zdt.toInstant() );
लेकिन यह थोड़ा उपयोगिता विधि बनाने के लिए नट होगा।
static public java.util.Date toJavaUtilDateFromZonedDateTime ( ZonedDateTime zdt ) {
Instant instant = zdt.toInstant();
// Data-loss, going from nanosecond resolution to milliseconds.
java.util.Date utilDate = java.util.Date.from( instant ) ;
return utilDate;
}
प्रश्न की तुलना में इस सभी कोड में अंतर देखें। प्रश्न का कोड ZTCedDateTime उदाहरण के समय क्षेत्र को UTC में समायोजित करने का प्रयास कर रहा था। लेकिन यह आवश्यक नहीं है। सैद्धांतिक रूप:
ZonedDateTime = झटपट + जोनआईड
हम सिर्फ इंस्टेंट भाग को निकालते हैं, जो पहले से ही यूटीसी (मूल रूप से यूटीसी में, सटीक विवरण के लिए कक्षा डॉक्टर) पढ़ें।
जावा के बारे में
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
, और अधिक ।
java.util.Date
औरjava.sql.Date
।