2017-06-30 13 views
10

एक ZoneId ऐसा हो जाता है पाने के लिए:क्या java.time.ZoneId का कोई कारण नहीं है जो ज़ोन आईडी के एनम समेत शामिल है?

ZoneId.of(ZoneIds.AMERICA_SAO_PAULO); 

जो लगता है:

ZoneId.of("America/Sao_Paulo"); 

या

ZoneId.of(ZoneId.SHORT_IDS.get("BET")); 

क्यों मौजूदा नहीं इस तरह के मूल्यों की एक Enum, जैसे के लिए कारण हो सकता है कम त्रुटि-प्रवण और बहुत अधिक ऑटो-पूर्ण मित्रवत?

+7

समय क्षेत्र डेटा हर समय बदलता है। नामित जोन कोड को तोड़ने के बिना डेटा को बदलने की अनुमति देते हैं। – shmosel

+0

ठीक है। बस चर्चा को आगे बढ़ाने के लिए कोड अभी भी तोड़ नहीं होगा, लेकिन संकलन समय के बजाय रनटाइम में? – Renan

+2

संभवतः, इसका उपयोग कैसे किया गया था इसके आधार पर। लेकिन स्पष्ट रूप से दोनों के बीच एक बड़ा अंतर है। – shmosel

उत्तर

8

मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि जावा संस्करण के बावजूद सभी संभावित टाइमज़ोन नामों की सूची बदल सकती है।

टाइमज़ोन जानकारी comes with Java installation (आमतौर पर फ़ोल्डर <java-home>/lib/zi, या jre/lib/tzdb.dat फ़ाइल में नए संस्करणों में)। लेकिन यह जानकारी जावा संस्करण (Timezone Updater Tool का उपयोग करके) को बदले बिना अपडेट किया जा सकता है।

यदि टाइमज़ोन डेटा अपडेट किया गया है (लेकिन जावा संस्करण समान रहता है) और एक नई जोन आईडी बनाई गई है, तो इसके लिए एपीआई "अधूरा" छोड़कर Enum के बराबर नहीं होगा। और टाइमज़ोन डेटा changes faster than JDK updates - यहां तक ​​कि अगर ऐसा नहीं होता है, तो जैसे ही हम चाहें उत्पादन वातावरण में जेडीके संस्करण को अपडेट करना हमेशा संभव नहीं होता है।

मैं एपीआई रचनाकारों के लिए बात नहीं कर सकता, लेकिन मुझे लगता है कि उन्होंने इसे छोड़ने का फैसला किया है क्योंकि नामस्थान जेडीके की तुलना में तेज़ी से बढ़ सकता है, और अद्यतित एनमम्स को बनाए रखना एक होगा अंतहीन और हमेशा अपूर्ण नौकरी।

तुम सच में अगर एक समय क्षेत्र का नाम मान्य है की जांच करना चाहते हैं, तो आप कर सकते हैं:

if (ZoneId.getAvailableZoneIds().contains("America/Sao_Paulo")) { 
    // America/Sao_Paulo is a valid ID 
} 

या बस ZoneId.of("zone-name") फोन और ZoneRulesException पकड़ने।


मैं सिर्फ JDK 1.8.0_131में ZoneId.getAvailableZoneIds() कहा जाता है और यह 600 प्रविष्टियां हैं। शायद कोई भी 600 enum स्थिरांक बनाना चाहता था।

कोई तर्क दे सकता है कि वे java.util.Locale वर्ग के समान कुछ कर सकते थे, जिसमें कुछ भाषाओं (जैसे अंग्रेजी, जर्मन, फ्रेंच, आदि) के लिए कुछ प्रविष्टियां हैं। लेकिन यह तय करने के लिए कि कौन से समय क्षेत्र निरंतर "लायक" हैं?हो सकता है कि उन्होंने बस उस और के बारे में बहुत कुछ नहीं सोचने का फैसला किया "अरे, इसे भूल जाओ, ज़ोन नाम" के साथ बस String का उपयोग करें।


एक अन्य संभावित कारण तथ्य यह है कि ZoneId.of() विधि भी यूटीसी ऑफसेट (जैसे +05:00, -0300, +09:30:15 और इसी तरह) प्राप्त करने के लिए डिजाइन किया गया था हो सकता है। चूंकि ऑफ़सेट घंटे, मिनट और सेकंड स्वीकार करते हैं, इसलिए सैकड़ों संभावित ऑफसेट हैं और प्रत्येक के लिए enums बनाने अव्यवहारिक होगा।

फिर से, कोई पर बहस कर सकता है "अरे, नामों के लिए केवल enums बनाएं और ऑफ़सेट के बारे में भूल जाएं"। लेकिन संभव enum नाम बनाने के कारणों से पहले ही चर्चा नहीं हुई थी।

+0

तो, जहां मुझे वर्तमान क्षेत्र आईडी की पूरी सूची मिल जाएगी? –

3

यदि आप ZoneId#getAvailableZoneIds विधि का विवरण देखते हैं, तो आप जानते हैं क्यों?

इस सेट में सभी उपलब्ध क्षेत्र-आधारित आईडी का स्ट्रिंग फॉर्म शामिल है। ऑफसेट-आधारित जोन आईडी वापस सेट में शामिल नहीं हैं। जोनआईडी बनाने के लिए आईडी को of(String) पर पास किया जा सकता है।

ज़ोन आईडी का सेट समय के साथ बढ़ा सकता है, हालांकि एक सामान्य अनुप्रयोग में आईडी का सेट तय किया गया है। इस विधि के लिए प्रत्येक कॉल थ्रेड-सुरक्षित है।

5

जेडीके में समय-क्षेत्र का सेट completely replaced हो सकता है। इस प्रकार, ज़ोन के लिए enum को परिभाषित करना संभव नहीं है।

इसके अलावा, समय-क्षेत्र पहचानकर्ता अपेक्षाकृत अस्थिर हैं। वे बदला, विलय और आम तौर पर बदल जाते हैं। (मेरे सहित विभिन्न लोगों ने आईएएनए डेटाबेस में अधिक स्थिरता प्राप्त करने की कोशिश की है, लेकिन डेटाबेस रखरखाव सहमत नहीं है।)

कक्षा ThreeTen-Extra में स्थिरता प्रदान करने के लिए एक पुल अनुरोध पर विचार किया जाएगा।

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