Java 8 java.time कक्षाएं एक getMillis () पद्धति को क्यों याद कर रही हैं?


64

Java 8 में पैकेज java.time में तारीखों और समयों के लिए एक पूरी नई लाइब्रेरी है। यह किसी के लिए भी बहुत ही स्वागत योग्य बात है, जो पहले से ही डेट हेल्पर तरीकों को अपना कर प्रोसेसिंग के साथ या उससे पहले JodaTime का उपयोग कर चुका है। इस पैकेज में कई कक्षाएं टाइमस्टैम्प का प्रतिनिधित्व करती हैं और हेल्पर तरीके हैं जैसे getHour()टाइमस्टैम्प से घंटों का समय निकालना, getMinute()टाइमस्टैम्प से मिनट getNano()निकालना, टाइमस्टैम्प आदि से नैनो प्राप्त करना ...

मैंने देखा कि उनके पास getMillis()टाइम स्टांप की मिल को प्राप्त करने के लिए एक विधि नहीं है । इसके बजाय किसी को कॉल विधि करनी होगी get(ChronoField.MILLI_OF_SECOND)। मेरे लिए यह पुस्तकालय में एक विसंगति की तरह लगता है। क्या किसी को पता है कि ऐसा तरीका क्यों गायब है, या जैसा कि जावा 8 अभी भी विकास में है, क्या कोई संभावना है कि इसे बाद में जोड़ा जाएगा?

https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html

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

प्रत्येक तिथि समय उदाहरण उन क्षेत्रों से बना होता है, जिन्हें एपीआई द्वारा आसानी से उपलब्ध कराया जाता है। निचले स्तर तक खेतों तक पहुँचने के लिए java.time.temporalपैकेज देखें । प्रत्येक वर्ग में तारीखों और समय के सभी तरीकों को मुद्रण और पार्स करने के लिए समर्थन शामिल है। java.time.formatअनुकूलन विकल्पों के लिए पैकेज देखें ...

इस तरह के वर्ग का उदाहरण:
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html

ISO-8601 कैलेंडर सिस्टम में समय-क्षेत्र के बिना दिनांक-समय, जैसे कि 2007-12-03T10: 15: 30।

LocalDateTimeएक अपरिवर्तनीय दिनांक-समय ऑब्जेक्ट है जो दिनांक-समय का प्रतिनिधित्व करता है, जिसे अक्सर साल-महीने-दिन-मिनट-मिनट के रूप में देखा जाता है। अन्य दिनांक और समय फ़ील्ड, जैसे दिन का वर्ष, दिन का सप्ताह और सप्ताह का वर्ष, भी पहुँचा जा सकता है। समय का प्रतिनिधित्व नैनोसेकंड सटीक द्वारा किया जाता है। उदाहरण के लिए, मूल्य "2 अक्टूबर 2007 को 13: 45.30.123456789" पर संग्रहीत किया जा सकता है LocalDateTime...


ऐसा लगता है मानो वे get()व्यक्तिगत, अनोखे नाम देने के बजाय, सभी कहे जाने वाले तरीकों का एक गुच्छा हल करने के लिए बहुरूपता का उपयोग करना चाहते थे । यदि यह आपको परेशान करता है, तो एक वर्ग लिखें जो मूल वर्ग को विरासत में मिला है, और अपनी खुद की getMillis()विधि को नई कक्षा में रखें।
रॉबर्ट हार्वे

@RobertHarvey java.time पैकेज में अधिकांश कक्षाएं अपरिवर्तनीय हैं और इन्हें बढ़ाया नहीं जा सकता।
अस्वच्छ २५'१४ को 25:१५

2
@RobertHarvey मेरे लिए सवाल यह नहीं है कि मैं इसे कैसे हल कर सकता हूं। यह सिर्फ एक अजीब असंगति थी और मुझे आश्चर्य हुआ कि क्या इसके लिए एक दिलचस्प व्याख्या है।
तारामो

मुझे लगता है कि कुछ आर्किटेक्चर / ओएस मज़बूती से मिलीसेकंड का समर्थन नहीं करते हैं। दूसरे शब्दों में, सिस्टम का समय केवल सेंटीसेकंड या मिलीसेकंड तक नहीं पाया जा सकता है।
मार्को

देखें stackoverflow.com/a/23945792/40064 एक रास्ते पर के माध्यम से यह करने के लिए Instantवर्ग
विम Deblauwe

जवाबों:


63

JSR-310 नैनोसेकंड पर आधारित है, न कि मिलीसेकंड पर। जैसे, समझदार तरीकों का न्यूनतम सेट घंटे, मिनट, दूसरे और नैनोसेकंड पर आधारित होता है। एक नैनोसेकंड बेस होने का निर्णय परियोजना के मूल निर्णयों में से एक था, और एक जिसे मैं दृढ़ता से सही मानता हूं।

मिलिस के लिए एक विधि जोड़ना, जो कि नैनोसेकंड का ओवरलैप होगा, एक गैर-स्पष्ट तरीका है। उपयोगकर्ताओं को इस बारे में सोचना होगा कि क्या नैनो क्षेत्र उदाहरण के लिए नैनो-ऑफ-सेकंड या नैनो-मिल का था। एक भ्रामक अतिरिक्त विधि जोड़ना वांछनीय नहीं है, इसलिए विधि को छोड़ दिया गया था। जैसा कि बताया गया है, विकल्प get(MILLI_OF_SECOND)उपलब्ध है।

FWIW, मैं getMillis()भविष्य में विधि को जोड़ने का विरोध करूंगा ।


1
मुझे इस प्रश्न के कुछ बहुत अच्छे उत्तर मिल गए हैं, लेकिन आपका उत्तर मेरा पसंदीदा है क्योंकि यह छोटा है और फिर भी यह बहुत अच्छा बिंदु बनाता है और मुझे इस दृष्टिकोण की आवश्यकता के बारे में आश्वस्त करता है। धन्यवाद।
तारामो

12
@ s3ib यदि आप उत्तर देने वाले की प्रोफ़ाइल की जाँच करते हैं , तो आप यह भी देखेंगे कि वह बहुत ही एपीआई के लिए एक विनिर्देशन लीड है जिसके बारे में आप पूछ रहे हैं। यह आधिकारिक उत्तर के रूप में बनाता है क्योंकि यह इसे नहीं करता है :)
gnat

तो क्या ऐसा instant.getEpochSecond * 1000 + instant.getNano / 1000000करना उचित बॉयलरप्लेट है जो विरासत के साथ संवाद करने में सक्षम हो (इस बिंदु पर, सभी) जावा एपीआई, जावास्क्रिप्ट, आदि?
nilskp

10
नहीं, उस मामले में आप सिर्फ instant.toEpochMilli () का उपयोग कर सकते download.java.net/jdk8/docs/api/java/time/...
JodaStephen

20

OpenJDK का हिस्सा बनने से पहले, थ्रिटेन जीथब पर था और इससे पहले यह सोर्सफोर्ज पर था। इसके बाद, स्टीफन कोलबोर्न, जो jsr-310 पर एक विनिर्देश नेतृत्व है, ने एक सर्वेक्षण किया था जिसे आप अभी भी सोर्सफोर्ज साइट पर पा सकते हैं ।

The fourth question on the survey covered the method names for LocalTime:
1) getHourOfDay(), getMinuteOfHour(), getSecondOfMinute(), getNanoOfSecond()
2) getHour(), getMinute(), getSecond(), getNanoOfSecond()
3) getHour(), getMinute(), getSecond(), getNano()
4) another idea

केवल 6.23% ने उत्तर # 4 चुना और उनमें से लगभग 15% ने getMillis()कुल यानी 1% से भी कम वोट मांगे ।

शायद इसीलिए getMillisपहली जगह में नहीं था और मुझे ओपनजेडक मेलिंग सूची से संबंधित कुछ भी नहीं मिला, इसलिए मामला स्पष्ट रूप से बाद में चर्चा में नहीं आया।


3
मुझे लगता है कि लोगों को कई विकल्प देने से यह अधिक संभावना है कि वे उन विकल्पों में से एक को चुनते हैं, भले ही उनका आदर्श विकल्प "अन्य" के तहत हो। मुझसे गलती भी हो सकती है।
एलन ग्रेलनक

2
@AllonGuralnek हां निश्चित रूप से - हालांकि मिली एपीआई में मिलीसेकंड घटक महत्वपूर्ण था क्योंकि सब कुछ युग के बाद से कई मिली पर आधारित था। नए API में यह कम प्रासंगिक IMO है। अधिकांश उपयोग के मामलों में, आपको या तो एक दूसरी परिशुद्धता या सबसे अच्छी परिशुद्धता उपलब्ध (नैनो) की आवश्यकता होती है। शायद मैं गलत हो सकता हूँ।
assylias

1
यह तरीकों के नामकरण के बारे में पूछने के लिए लगता है , न कि किन तरीकों का अस्तित्व होना चाहिए।
svick

1
सही, क्षमा करें, मैं स्पष्ट नहीं था: मेरा मतलब था कि सर्वेक्षण से यह सवाल है कि यह सीधे इस प्रश्न से संबंधित नहीं है।
svick

15

वे कक्षाएं जो अस्पष्ट यूटीसी समय का प्रतिनिधित्व करती हैं (वे त्वरित, ऑफसेटसेटेट, ज़ोनडटेट टाइम हैं) जावा एपोच से निरपेक्ष ऑफसेट तक पहुंचने के लिए दो सहायक तरीके हैं, अर्थात आप java.util.Date में 'मिलीसेकंड समय' कहते हैं, जिसका आप उपयोग कर सकते हैं। मिलीसेकंड पर पाने के लिए

long getEpochSecond()
int getNano()

1000L*getEpochSecond() + getNano() / 1000000L;

Jsr 310 मेलिंग सूचीlong getEpochMillis() पर चर्चा करने के बजाय इसे क्यों चुना गया है, इसके कुछ कारण , जिनमें से कुछ मैंने इसके लिए निकाले हैं:

यह उचित लगता है कि मिलीसेकंड सटीक पर्याप्त नहीं होगा। हालांकि, नैनोसेकंड की शुद्धता से अधिक कुछ भी अत्यधिक लगता है

...

इसे लागू करने के लिए, मेरा पसंदीदा विकल्प 64 बिट लंबा सेकंड (हस्ताक्षरित) + 32 बिट इंट नैनोसेकंड (अहस्ताक्षरित) होगा।

...

मैं विभाजन को दूसरे स्तर पर होना पसंद करता हूं क्योंकि यह विज्ञान में समय की आधिकारिक एसआई इकाई है, और सबसे सार्वभौमिक रूप से सहमत मानक है।

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

प्रस्तावित के रूप में दूसरे पर विभाजित, 290 अरब वर्षों में नैनोसेकंड के उदाहरणों की एक सीमा देता है। हालांकि किसी को भी समय-रेखा की उस सीमा पर उस सटीकता का उपयोग नहीं करना चाहिए, मैं इसे ब्लॉक करने की तुलना में इसका समर्थन करने के लिए इसका आसान सुझाव दूंगा। दिनों के स्तर पर स्थापित करना इंस्टेंट के लिए समस्याग्रस्त है क्योंकि यह लीप सेकंड को हैंडल नहीं करता है।

मुझे लगता है कि एक और कारण जानबूझकर java.util से परिवर्तित करना मुश्किल था। JSR310 वर्गों के लिए, उम्मीद है कि डेवलपर्स विभिन्न विकल्पों के बीच के अंतर को समझने की कोशिश करेंगे और न केवल आँख बंद करके (गलत) नई कक्षाओं का उपयोग करेंगे।

जैसे कि LocalDateTimeकक्षा में वे विधियां क्यों नहीं हैं - वे संभवतः वहां मौजूद नहीं हो सकते क्योंकि LocalDateTimeयूटीसी समय रेखा से बंधा हुआ नहीं है जब तक आप यह तय नहीं करते कि आप किस क्षेत्र में हैं या आपकी यूटीसी ऑफसेट क्या है, किस बिंदु पर आप अपने आप को एक OffsetDateTimeया ZonedDateTime(दोनों की आवश्यक विधियाँ हैं)।

वैकल्पिक रूप से, आप अपने आप को LOCAL_EPOCHनिरंतर परिभाषित कर सकते हैं 1970-01-01T00:00:00और फिर MILLIS.between(LOCAL_EPOCH, localTime)मिलीसेकंड में किसी प्रकार की अवधि प्राप्त कर सकते हैं। यह मान, तथापि, द्वारा लौटाए गए किसी भी मूल्य के साथ संगत नहीं किया जाएगा System.currentTimeMilliseconds()या java.util.Date.getTime(), जब तक कि बेशक आप UTC समय होने के लिए अपने स्थानीय समय निर्धारित करें; लेकिन इस मामले में आप ज़ोनऑफ़सेट.UTC के साथ इंस्टेंट सीधे या ऑफ़सेटडाइट टाइम का उपयोग कर सकते हैं।


4
" वे संभवतः वहां मौजूद नहीं हो सकते हैं क्योंकि लोकलडाइमटाइम यूटीसी समय रेखा से बंधा नहीं है " => एक लोकलडेटाइम निश्चित रूप से एक getMillisविधि हो सकती है जो मूल रूप से वापस आ जाएगी getNanos()/1e6- तथ्य यह है कि यह समय में एक पल नहीं है यह एक मिलीसेकंड होने से नहीं रोकता है घटक।
अस्वच्छ २ias

2
" मुझे लगता है कि एक और कारण जानबूझकर java.util से कन्वर्ट करना मुश्किल था। JSR310 वर्गों के लिए। " शायद सच है, लेकिन दुर्भाग्य से "युग के बाद से मिलिस" समय का लगभग सार्वभौमिक प्रतिनिधित्व बन गया है, इसलिए किसी भी चीज़ की ज़रूरत है पुराने जावा एपीआई, जावास्क्रिप्ट, कुछ और के साथ संवाद करने के लिए, यह चूक एक वास्तविक परेशानी है।
nilskp

शीर्ष पर आपका कोड स्निपेट गलत है - आपको 1000 से getEpochSecond को गुणा करना होगा।
टिन मैन

@nilskp वे दो अलग चीजें हैं। प्रश्न के बारे getMillis()में पूछ रहा है के रूप में मिलमिलिस-ऑफ-सेकंड; आप "युग के बाद से मिलिस" के बारे में बात कर रहे हैं। स्वीकृत उत्तर में बताया गया है कि पूर्व अनुपस्थित है। उत्तरार्द्ध पहले से ही उपलब्ध है Instant.toEpochMillis()। तो, एक के लिए LocalDateTime, आप जाना होगा:ldt.toInstant(offset).toEpochMillis()
SusanW
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.