2013-04-12 5 views
9

जोडा समय का समय क्षेत्र आईडी केवल कोड के निम्नलिखित खंड के साथ प्रदर्शित किया जा सकता है।टाइमज़ोन ऑफसेट, टाइमज़ोन आईडी और जोडा समय/जावा 8 में लंबा नाम सूचीबद्ध करने के लिए कैसे?

Set<String> zoneIds = DateTimeZone.getAvailableIDs(); 

for(String zoneId:zoneIds) { 
    System.out.println(zoneId); 
} 

लेकिन कैसे इसी समय क्षेत्र ऑफसेट, समय क्षेत्र आईडी, और लंबे समय नाम प्रदर्शित करने के लिए इतना है कि सूची निम्नलिखित की तरह कुछ दिखाई दे सकता है?

(GMT-10:00) Pacific/Honolulu, Hawaii Standard Time 
(GMT-10:00) Pacific/Johnston, Hawaii Standard Time 
(GMT-10:00) Pacific/Fakaofo, Tokelau Time 
(GMT-10:00) HST, Hawaii Standard Time 

चयन के लिए ड्रॉप-डाउन-बॉक्स में उन्हें सूचीबद्ध करने की आवश्यकता है।


निम्नलिखित स्निपेट नाम दिखाता है लेकिन ऑफसेट दिखाता है कि यह जीतने वाला दिखता है।

Set<String> zoneIds = DateTimeZone.getAvailableIDs(); 

for (String zoneId : zoneIds) { 
    int offset = DateTimeZone.forID(zoneId).getOffset(new DateTime()); 
    String longName = TimeZone.getTimeZone(zoneId).getDisplayName(); 

    System.out.println("(" + offset + ") " + zoneId + ", " + longName); 
} 

लंबी सूची प्रदर्शित में से, उनमें से कुछ, जैसे दिखाए जाते हैं

(-36000000) Pacific/Honolulu, Hawaii Standard Time 
(-36000000) Pacific/Johnston, Hawaii Standard Time 
(-36000000) Pacific/Fakaofo, Tokelau Time 
(-36000000) HST, Hawaii Standard Time 

ऑफसेट के रूप में this सूची में दिखाया जाना चाहिए।

उत्तर

16

निम्नलिखित दृष्टिकोण काम किया।

import java.util.Set; 
import java.util.TimeZone; 
import org.joda.time.DateTimeZone; 
import org.joda.time.format.DateTimeFormat; 
import org.joda.time.format.DateTimeFormatter; 

Set<String> zoneIds = DateTimeZone.getAvailableIDs(); 
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("ZZ"); 

for (String zoneId : zoneIds) { 
    String offset = dateTimeFormatter.withZone(DateTimeZone.forID(zoneId)).print(0); 
    String longName = TimeZone.getTimeZone(zoneId).getDisplayName(); 

    System.out.println("(" + offset + ") " + zoneId + ", " + longName); 
} 

वहाँ भी अन्य और शायद बेहतर तरीके कि मैं अभी से अनभिज्ञ हूं हो सकता है।


या

import java.util.Set; 
import org.joda.time.DateTimeUtils; 
import org.joda.time.DateTimeZone; 
import org.joda.time.format.DateTimeFormat; 
import org.joda.time.format.DateTimeFormatter; 

Set<String> zoneIds = DateTimeZone.getAvailableIDs(); 
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("ZZ"); 

for (String zoneId : zoneIds) { 
    String offset = dateTimeFormatter.withZone(DateTimeZone.forID(zoneId)).print(0); 
    String longName = DateTimeZone.forID(zoneId).getName(DateTimeUtils.currentTimeMillis()); 

    System.out.println("(" + offset + ") " + zoneId + ", " + longName); 
} 

ग्रीनविच मीन टाइम (Etc/GMT+0, उदाहरण के लिए) के लिए, यह प्रदर्शित होता है, उदाहरण के +00:00 के बजाय पहले मामले में के रूप में GMT+00:00 प्रदर्शित करने के लिए। mm: hh -

नाम स्थान के लिए उपलब्ध नहीं है, तो यह विधि (public final String getName(long instant)) में प्रारूप [+] एक स्ट्रिंग देता है। इस प्रकार

एक उपयुक्त Locale भी इस्तेमाल किया जा सकता है, तो अतिभारित विधि का उपयोग कर की जरूरत है,

public String getName(long instant, Locale locale) 

लघु नाम, समन्वित यूनिवर्सल समय के लिए उदाहरण यूटीसी के लिए प्रदर्शित किया जा सकता।

import java.util.Set; 
import org.joda.time.DateTimeUtils; 
import org.joda.time.DateTimeZone; 
import org.joda.time.format.DateTimeFormat; 
import org.joda.time.format.DateTimeFormatter; 

Set<String> zoneIds = DateTimeZone.getAvailableIDs(); 
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("ZZ"); 

for (String zoneId : zoneIds) { 
    String offset = dateTimeFormatter.withZone(DateTimeZone.forID(zoneId)).print(0); 
    String shortName = DateTimeZone.forID(zoneId).getShortName(DateTimeUtils.currentTimeMillis()); 

    System.out.println("(" + offset + ") " + zoneId + ", " + shortName); 
} 
एक उपयुक्त Locale साथ

, अगर अतिभारित विधि का उपयोग कर की जरूरत है,

public String getShortName(long instant, Locale locale) 

अद्यतन:

का उपयोग Java Time API जावा में एसई 8 जिसमें यह आगे सरलीकृत है ।

import java.time.ZoneId; 
import java.time.ZoneOffset; 
import java.time.ZonedDateTime; 
import java.time.format.TextStyle; 
import java.util.Locale; 
import java.util.Set; 

Set<String> zoneIds = ZoneId.getAvailableZoneIds(); 

for (String zoneId : zoneIds) { 
    ZoneId zone = ZoneId.of(zoneId); 
    ZonedDateTime zonedDateTime = ZonedDateTime.now(zone); 

    ZoneOffset offset = zonedDateTime.getOffset(); 
    String longName = zone.getDisplayName(TextStyle.FULL, Locale.ENGLISH); 

    System.out.println("(" + offset + ") " + zoneId + ", " + longName); 
} 

प्रदर्शन नाम में java.time.format.TextStyle में विभिन्न शैलियों उपलब्ध हैं। उदाहरण के लिए, संक्षेप TextStyle.SHORT का उपयोग करके प्रदर्शित किया जा सकता है।

zone.getDisplayName(TextStyle.FULL, Locale.ENGLISH) "इंडिया टाइम" जैसे लंबे नाम प्रदर्शित करेगा। हालांकि, यह जोडा समय के विपरीत एक पूर्ण नाम नहीं है।

निम्नलिखित दिए गए नाम का पूरा नाम "भारत मानक समय" (जहां भी लागू हो) प्रदर्शित करेगा।

DateTimeFormatter pattern = DateTimeFormatter.ofPattern("zzzz"); 
String longName = pattern.format(ZonedDateTime.now(ZoneId.of(zoneId))); 

निम्नलिखित प्रदर्शित करेगा एक क्षेत्र ऑफसेट (पैटर्न का पूंजीकरण ध्यान दें) GMT+05:30 की तरह दिए गए क्षेत्र के।

DateTimeFormatter pattern = DateTimeFormatter.ofPattern("ZZZZ"); 
String longName = pattern.format(ZonedDateTime.now(ZoneId.of(zoneId))); 

निम्नलिखित संक्षिप्त रूपों को प्रदर्शित करने के लिए है।

DateTimeFormatter pattern = DateTimeFormatter.ofPattern("zzz"); 
String longName = pattern.format(ZonedDateTime.now(ZoneId.of(zoneId))); 

राजधानी ZZZ के लिए +0530 की तरह क्षेत्र ऑफसेट, +0000

https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

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