2009-11-08 18 views
24

मैं उपयोगकर्ताओं को अपने वेब ऐप पर अपनी पसंद के समय क्षेत्रों के आधार पर ईवेंट शेड्यूल करने की अनुमति दे रहा हूं।जावा में टाइमज़ोन

मैं अंतिम उपयोगकर्ता को समय क्षेत्र की एक अच्छी सूची प्रस्तुत करना चाहता हूं और फिर इसे सर्वर अंत में आसानी से java.util.TimeZone ऑब्जेक्ट में परिवर्तित करना चाहता हूं।

String[] TimeZone.getAvailableIds() कुछ ऐसा है जो मैं उपयोग कर सकता हूं, लेकिन मुद्दा यह है कि यह लगभग 585 समय क्षेत्र आईडी प्रिंट करता है।

उपयोगकर्ता को समय क्षेत्र की एक संक्षिप्त सूची (जैसे विंडोज बॉक्स टाइम ज़ोन सेटिंग्स के लिए) प्रस्तुत करने का सबसे अच्छा तरीका क्या है और आसानी से टाइम आईडी पर ऑब्जेक्ट में टाइमज़ोन ऑब्जेक्ट में कनवर्ट करना है?

+0

एक संदर्भ के रूप में, विकिपीडिया एक समय क्षेत्र नामों की सूची रखता है (http://en.wikipedia.org/wiki/List_of_tz_database_time_zones)। –

उत्तर

20

टाइमज़ोन की सूची बहुत ही एप्लिकेशन और लोकेल विशिष्ट है। केवल आप ही जानते हैं कि आपके उपयोगकर्ताओं के लिए कौन से क्षेत्र सबसे अधिक लागू हैं। हम वास्तव में विभिन्न क्षेत्रों के लिए अलग-अलग सूचियां हैं।

यहाँ आपके संदर्भ के लिए उपयोगकर्ताओं के लिए हमारी सूची,

"Pacific/Midway", 
    "US/Hawaii", 
    "US/Alaska", 
    "US/Pacific", 
    "America/Tijuana", 
    "US/Arizona", 
    "America/Chihuahua", 
    "US/Mountain", 
    "America/Guatemala", 
    "US/Central", 
    "America/Mexico_City", 
    "Canada/Saskatchewan", 
    "America/Bogota", 
    "US/Eastern", 
    "US/East-Indiana", 
    "Canada/Eastern", 
    "America/Caracas", 
    "America/Manaus", 
    "America/Santiago", 
    "Canada/Newfoundland", 
    "Brazil/East", 
    "America/Buenos_Aires", 
    "America/Godthab", 
    "America/Montevideo", 
    "Atlantic/South_Georgia", 
    "Atlantic/Azores", 
    "Atlantic/Cape_Verde", 
    "Africa/Casablanca", 
    "Europe/London", 
    "Europe/Berlin", 
    "Europe/Belgrade", 
    "Europe/Brussels", 
    "Europe/Warsaw", 
    "Africa/Algiers", 
    "Asia/Amman", 
    "Europe/Athens", 
    "Asia/Beirut", 
    "Africa/Cairo", 
    "Africa/Harare", 
    "Europe/Helsinki", 
    "Asia/Jerusalem", 
    "Europe/Minsk", 
    "Africa/Windhoek", 
    "Asia/Baghdad", 
    "Asia/Kuwait", 
    "Europe/Moscow", 
    "Africa/Nairobi", 
    "Asia/Tbilisi", 
    "Asia/Tehran", 
    "Asia/Muscat", 
    "Asia/Baku", 
    "Asia/Yerevan", 
    "Asia/Kabul", 
    "Asia/Yekaterinburg", 
    "Asia/Karachi", 
    "Asia/Calcutta", 
    "Asia/Colombo", 
    "Asia/Katmandu", 
    "Asia/Novosibirsk", 
    "Asia/Dhaka", 
    "Asia/Rangoon", 
    "Asia/Bangkok", 
    "Asia/Krasnoyarsk", 
    "Asia/Hong_Kong", 
    "Asia/Irkutsk", 
    "Asia/Kuala_Lumpur", 
    "Australia/Perth", 
    "Asia/Taipei", 
    "Asia/Tokyo", 
    "Asia/Seoul", 
    "Asia/Yakutsk", 
    "Australia/Adelaide", 
    "Australia/Darwin", 
    "Australia/Brisbane", 
    "Australia/Sydney", 
    "Pacific/Guam", 
    "Australia/Hobart", 
    "Asia/Vladivostok", 
    "Asia/Magadan", 
    "Pacific/Auckland", 
    "Pacific/Fiji", 
    "Pacific/Tongatapu", 
0

क्या आप "जीएमटी +/- घंटे" नोटेशन (मिनट छोड़ने) का उपयोग कर कस्टम टाइम जोन आईडी की सूची का उपयोग नहीं कर सके?

(संपादित करें: मेरे पहले सुझाव के साथ, डेलाइट सेविंग टाइम संक्रमण स्वचालित नहीं है। इस समस्या को हल करने के लिए, आप पहले उपयोगकर्ता को जीएमटी ऑफ़सेट चुनने के लिए कह सकते हैं और फिर समय क्षेत्र आईडी की एक (लिंक) सूची दिखा सकते हैं का उपयोग कर भरपाई दिया:।

public static String[] getAvailableIDs(int rawOffset) 

इस तरह, उपयोगकर्ता सक्षम एक कम सूची में अपने समय क्षेत्र चुनें डेलाइट सेविंग व्यवहार से और लाभ (प्रयोक्ता अनुभव के लिए बेहतर) होगा)

+1

धन्यवाद। हां, लेकिन java.util.TimeZone जो इसके साथ बनाया जाएगा, डेलाइट सेविंग टाइम को स्वचालित रूप से ध्यान में रखेगा। यदि मैं टाइम ज़ोन बना रहा हूं: टाइमज़ोन.getटाइमज़ोन ("अमेरिका/लॉस_एंजेलस"), तो मुझे डीएसटी इत्यादि के बारे में चिंता करने की आवश्यकता नहीं है या क्या मुझे गलती है? – Vish

+0

आप सही हैं। वास्तव में, एक कस्टम टाइम जोन आईडी के साथ कोई डेलाइट सेविंग टाइम संक्रमण नहीं। मैं अपने उत्तर को एक और सुझाव के साथ अपडेट कर दूंगा। –

+0

धन्यवाद। यह भी काम करता है! – Vish

0

आप की जरूरत है सूची को देखने के तरीके को चुनने की ग्रैन्युलरिटी, मैं सबसे अच्छी हार्ड-कोडेड सूची I का उपयोग करूंगा मिल सकता है (this is a good example) और यह सुनिश्चित करें कि यह यथासंभव सटीक रूप से प्रदर्शित और परिवर्तित हो।

बस ध्यान रखें कि उन 585 समय क्षेत्रों में से प्रत्येक का अर्थपूर्ण अर्थ है (उदाहरण के लिए डीएसटी) और उपयोगकर्ता शायद उनके लिए सर्वश्रेष्ठ समय क्षेत्र चुनना चाहें। हालांकि मैं सहमत हूं कि सूची बहुत कम हो सकती है।

+0

मुझे नहीं लगता कि यह सूची डेलाइट बचत के लिए कैसे हो सकती है, दुर्भाग्य से .... –

0

मैं एक कंपनी मैं अब से किसी का स्वामित्व नहीं है के लिए ऐसा किया है, इसलिए कोड प्रदान नहीं कर सकते। विंडोज़ पर जेवीएम tzmappings नामक फ़ाइल के साथ आता है (C:\Program Files\Java\jre6\lib या इसी तरह देखें) जो जावा के ज़ोनिनोफो-आधारित महाद्वीप/सिटी फॉर्म में विंडोज टाइमज़ोन को मानचित्र करता है।

दुर्भाग्य से, tzmappings में टेक्स्ट नाम भयानक हैं, इसलिए आपको कुछ मिनटों के सारणीकरण की आवश्यकता है। Regedit खोलें और HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones पर नेविगेट करें। इसके तहत मशीन पर प्रत्येक टाइमज़ोन के लिए एक कुंजी है; विंडोज 7 में लगभग 9 0 है। प्रत्येक कुंजी में Display नामक एक मान होता है जो आप चाहते हैं कि पाठ का नाम है; प्रत्येक के लिए जावा टाइम ज़ोन पहचानकर्ता खोजने के लिए tzmappings में कुंजी को स्वयं देखें।

0

उन लोगों के साथ, मैं उन्हें एक चुनिंदा बॉक्स सूची में shoehorn करने की कोशिश नहीं करता .... मैं उन्हें एक अलग मोडल संवाद (या पॉपअप, यदि आपको चाहिए) में एक सूची में डाल दिया, उपयोगकर्ता को चलो स्क्रॉल करें और वे जिस नाम को चाहते हैं उसे क्लिक करें। वे मोडल संवाद में एक लिंक पर क्लिक करेंगे, और यह सही कोड के साथ एक टेक्स्ट फ़ील्ड पॉप्युलेट करेगा, और फिर आप इसे अपने सर्वर पर जमा कर सकते हैं।

बेहतर अभी तक, उन्हें दुनिया के मानचित्र पर अपने स्थान पर क्लिक करें, और उस स्थान का उचित समय क्षेत्र में अनुवाद करने के लिए एक छवि मानचित्र का उपयोग करें।

4

आप जो केवल निम्नलिखित regexp

^(Africa|America|Asia|Atlantic|Australia|Europe|Indian|Pacific)/.* 
11

मैं सिर्फ एक छोटा सा जावा उपयोगिता है कि (समय क्षेत्र के चयन में जोनों विंडोज समय क्षेत्रों की एक सूची प्रदान लिखा है से मेल TZ ID के साथ सूची को कम कर सकते विंडोज़ में संवाद), और उनके संबंधित जावा टाइमज़ोन ऑब्जेक्ट्स। देखें https://github.com/nfergu/Java-Time-Zone-List

यह http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml

+0

टाइमज़ोनलिस्ट पर अच्छी नौकरी। जावा आईडी में सभी माइक्रोसॉफ्ट टाइमज़ोन मैप करने के लिए धन्यवाद। – Peter

+0

मैं सहमत हूं। यह उस स्थान पर है जो मैं खोज रहा था। – JamesA

0

पर CLDR मैपिंग पर आधारित है बस tbruyelle द्वारा जवाब पूरक मैं कुछ और देशों (कनाडा जैसे) कहा, "/" फिल्टर के हिस्से को निकाल दिया और उपलब्ध कराई गई एक साधन सूची को सॉर्ट करने के लिए।

public static void main(String[] args) 
{ 
    List<String> simplifiedTimezoneList = getTimezoneIdList(); 

    for (String tz : simplifiedTimezoneList) 
     System.out.println(tz); 
} 

public static List<String> getTimezoneIdList() 
{ 
    String[] temp = TimeZone.getAvailableIDs(); 
    List<String> timezoneList = new ArrayList<String>(); 
    List<String> simplifiedTimezoneList = new ArrayList<String>(); 
    for (String tz : temp) 
    { 
     timezoneList.add(tz); 
    } 
    Collections.sort(timezoneList); 
    String filterList = "Canada|Mexico|Chile|Cuba|Brazil|Japan|Turkey|Mideast|Africa|America|Asia|Atlantic|Australia|Europe|Indian|Pacific"; 
    Pattern p = Pattern.compile("^(" + filterList + ").*"); 
    for (String tz : timezoneList) 
    { 
     Matcher m = p.matcher(tz); 
     if (m.find()) 
     { 
      simplifiedTimezoneList.add(tz); 
     } 
    } 
    return simplifiedTimezoneList; 
} 
संबंधित मुद्दे