2013-08-23 4 views
8

मैं एक आवेदन के लिए offset-from-UTC द्वारा समय क्षेत्र के संचय कर रहा हूँ इस लटकती का उपयोग कर:"मानक" टाइमज़ोन संक्षेप क्या हैं?

<select id="timezone" name="timezone" > 
<option value="-12">[UTC - 12] Baker Island Time</option> 
<option value="-11">[UTC - 11] Niue Time, Samoa Standard Time</option> 
<option value="-10">[UTC - 10] Hawaii-Aleutian Standard Time, Cook Island Time</option> 
<option value="-9.5">[UTC - 9:30] Marquesas Islands Time</option> 
<option value="-9">[UTC - 9] Alaska Standard Time, Gambier Island Time</option> 
<option value="-8">[UTC - 8] Pacific Standard Time</option> 
<option value="-7">[UTC - 7] Mountain Standard Time</option> 
<option value="-6">[UTC - 6] Central Standard Time</option> 
<option value="-5">[UTC - 5] Eastern Standard Time</option> 
<option value="-4.5">[UTC - 4:30] Venezuelan Standard Time</option> 
<option value="-4">[UTC - 4] Atlantic Standard Time</option> 
<option value="-3.5">[UTC - 3:30] Newfoundland Standard Time</option> 
<option value="-3">[UTC - 3] Amazon Standard Time, Central Greenland Time</option> 
<option value="-2">[UTC - 2] Fernando de Noronha Time, South Georgia &amp; the South Sandwich Islands Time</option> 
<option value="-1">[UTC - 1] Azores Standard Time, Cape Verde Time, Eastern Greenland Time</option> 
<option value="0">[UTC] Western European Time, Greenwich Mean Time</option> 
<option value="1">[UTC + 1] Central European Time, West African Time</option> 
<option value="2">[UTC + 2] Eastern European Time, Central African Time</option> 
<option value="3">[UTC + 3] Moscow Standard Time, Eastern African Time</option> 
<option value="3.5">[UTC + 3:30] Iran Standard Time</option> 
<option value="4">[UTC + 4] Gulf Standard Time, Samara Standard Time</option> 
<option value="4.5">[UTC + 4:30] Afghanistan Time</option> 
<option value="5">[UTC + 5] Pakistan Standard Time, Yekaterinburg Standard Time</option> 
<option value="5.5">[UTC + 5:30] Indian Standard Time, Sri Lanka Time</option> 
<option value="5.75">[UTC + 5:45] Nepal Time</option> 
<option value="6">[UTC + 6] Bangladesh Time, Bhutan Time, Novosibirsk Standard Time</option> 
<option value="6.5">[UTC + 6:30] Cocos Islands Time, Myanmar Time</option> 
<option value="7">[UTC + 7] Indochina Time, Krasnoyarsk Standard Time</option> 
<option value="8">[UTC + 8] Chinese Standard Time, Australian Western Standard Time, Irkutsk Standard Time</option> 
<option value="8.75">[UTC + 8:45] Southeastern Western Australia Standard Time</option> 
<option value="9">[UTC + 9] Japan Standard Time, Korea Standard Time, Chita Standard Time</option> 
<option value="9.5">[UTC + 9:30] Australian Central Standard Time</option> 
<option value="10">[UTC + 10] Australian Eastern Standard Time, Vladivostok Standard Time</option> 
<option value="10.5">[UTC + 10:30] Lord Howe Standard Time</option> 
<option value="11">[UTC + 11] Solomon Island Time, Magadan Standard Time</option> 
<option value="11.5">[UTC + 11:30] Norfolk Island Time</option> 
<option value="12">[UTC + 12] New Zealand Time, Fiji Time, Kamchatka Standard Time</option> 
<option value="12.75">[UTC + 12:45] Chatham Islands Time</option> 
<option value="13">[UTC + 13] Tonga Time, Phoenix Islands Time</option> 
<option value="14">[UTC + 14] Line Island Time</option> 

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

संपादित करें: इस सूची को प्रत्येक टाइमज़ोन के लिए एक एकल abbr पर पार्स किया गया है, लेकिन वे "लोकप्रिय" नहीं हैं।

मेरा नया सूची

[-12] => kwat 
[-11] => bst 
[-10] => ahst 
[-9.5] => ckhst 
[-9] => ahdt 
[-8] => akdt 
[-7] => east 
[-6] => cst 
[-5] => act 
[-4.5] => ant 
[-4] => acst 
[-3.5] => negt 
[-3] => adt 
[-2] => addt 
[-1] => azost 
[-0] => azomt 
[1] => bst 
[2] => bdst 
[3] => amt 
[3.5] => irst 
[4] => adt 
[4.5] => aft 
[5] => aktt 
[5.5] => ist 
[5.75] => npt 
[6] => aktst 
[6.5] => burt 
[7] => almst 
[8] => bnt 
[8.75] => cwst 
[9] => cdt 
[9.5] => cast 
[10] => chost 
[10.5] => cst 
[11] => anat 
[11.5] => lhst 
[12] => anast 
[12.75] => chast 
[13] => anast 
[14] => anast 

कोड:

$abbr = DateTimeZone::listAbbreviations(); 

$offsets=array('-12','-11','-10','-9.5','-9','-8','-7','-6', 
    '-5','-4.5','-4','-3.5','-3','-2','-1','-0','1','2','3','3.5', 
    '4','4.5','5','5.5','5.75','6','6.5','7','8','8.75','9','9.5', 
    '10','10.5','11','11.5','12','12.75','13','14'); 
$new = array(); 
$count = 0; 
$found = false; 
while($count < count($offsets)) 
{ 
    foreach($abbr as $k => $v) 
    { 
     foreach($v as $tz) 
     { 
      if($tz['offset'] == $offsets[$count]*3600) 
      { 
       $new[$offsets[$count]] = $k; 
       $found = true; 
       break; 
      } 
     } 
     if($found) 
     { 
      $found = false; 
      break; 
     } 
    } 
    $count++; 
} 
print_r($new); 
+1

एक नज़र में [DateTimeZone :: listAbbreviations] (http://www.php.net/manual/en/datetimezone.listabbreviations.php) ले लो। जो जानकारी आप चाहते हैं वह शायद वहां है, या किसी संबंधित तरीके में से एक में है। –

+1

यह 400 संक्षेपों की सूची है कि मैं प्रत्येक पृष्ठ लोड को पार्स नहीं कर सकता। मुझे केवल इन 24 की ज़रूरत है, मुझे लगता है कि कहीं एक आम सूची है कि मैं अभी खोजने में असमर्थ हूं। यह विशेष ड्रॉपडाउन ढूंढना भी मुश्किल था, अन्य लोग यह अच्छा नहीं थे। :/ – ABlankenship

+0

आप अपनी सूची प्रोग्रामेटिक रूप से बना सकते हैं और इसे सर्वर फाइल सिस्टम में स्टोर कर सकते हैं। जब आपको इसकी आवश्यकता होती है, तो उसकी उम्र जांचें और 24 घंटे तक कहें तो यह पुनर्निर्माण करें। फिर इसे सामान्य तरीके से शामिल/आवश्यकता है। यह सूची आप के लिए पूछ नहीं है, लेकिन यह मतलब है कि आप केवल प्रति दिन एक बार पूरी सूची पार्स। –

उत्तर

24

"मानक" समय क्षेत्र संक्षिप्त रूपों क्या हैं?

इसके लिए कोई मानक नहीं है। समय क्षेत्र संक्षेप आधिकारिक तौर पर किसी के द्वारा समन्वयित नहीं होते हैं। IANA TZDB में कुछ उपयोग किए जाते हैं, लेकिन उनमें से बहुत से यादृच्छिक रूप से चुने गए थे। अक्सर बहस होती है जिस पर संक्षेपों का उपयोग किया जाना चाहिए। उदाहरण के लिए, देखें कि ऑस्ट्रेलियाई संक्षेप in the list archives for April 2013 के बारे में कितनी पोस्ट थीं।

समय क्षेत्र संक्षेप की एक और सूची here मिल सकती है। यदि आप बारीकी से देखते हैं, तो आप देखेंगे कि कई संदिग्ध हैं। उदाहरण के लिए, CST "केंद्रीय मानक समय" (यूएसए), "चीन मानक समय", या "क्यूबा मानक समय" हो सकता है। EST "पूर्वी मानक समय" (यूएसए), या "पूर्वी मानक समय" (ऑस्ट्रेलिया) हो सकता है।

कुछ गैर-ऑस्ट्रेलियाई AEST पसंद कर सकते हैं, लेकिन कौन कहता है कि A ऑस्ट्रेलिया के लिए होना चाहिए, न कि अमेरिका के लिए?

एक और बहुत सामान्य उदाहरण, कुछ लोगों को हवाई के लिए HAST उपयोग करते हैं, जबकि दूसरों को HST उपयोग करें, क्योंकि वे अलास्का में Aleutian द्वीप बारे में कम परवाह सकता है (जो क्या A प्रतिनिधित्व करने के लिए माना जाता है) है।

बिंदु यह है कि समय क्षेत्र संक्षेपों की कोई भी सूची, कहीं भी आपको मिलती है, व्यक्तिपरक और राय होगी। कोई मानक नहीं है।

मैं इस लटकती का उपयोग कर एक आवेदन के लिए ऑफसेट द्वारा समय क्षेत्र के संचय कर रहा हूँ:

कृपया कि ऐसा नहीं करते हैं। एक समय क्षेत्र एक ऑफसेट नहीं है, और उनमें से 24 से अधिक हैं। कृपया the timezone tag wiki पढ़ें, विशेष रूप से "टाइम जोन! = ऑफ़सेट" शीर्षक वाला अनुभाग।

अपनी टिप्पणी से:

मैं अब यह एहसास है, तथापि अपने आवेदन तर्क के बाकी उस पर इस तरह से पहले से ही निर्भर करता है, और मैं केवल आज इस पूरा करने के लिए, इसे बदलने के लिए इतना समय नहीं है।

तब आपके आवेदन में कई त्रुटियां मौजूद रहेंगी। आप बस यह भरोसेमंद नहीं कर सकते - भले ही आपका ऐप सिर्फ यूएस में चलता न हो। इससे कोई फ़र्क नहीं पड़ता कि आप किस भाषा या प्लेटफ़ॉर्म पर हैं, किसी भी कार्यान्वयन में इसमें बहुत सारी रूपांतरण गलतियां होंगी।

मैं इन सरणियों हार्डकोड साथ ठीक हूँ, मैं सिर्फ नहीं पता है कि लोकप्रिय क्षेत्रों अमेरिका से बाहर हैं, मैं इस तरह के एक सूची पहले से ही लगा कहीं मौजूद हैं।

जब समय क्षेत्र की बात आती है, तो आपको कुछ भी कठिन कोड नहीं करना चाहिए। समय क्षेत्र नियम हर समय बदलते हैं, क्योंकि वे दुनिया के हर देश में राजनेताओं द्वारा नियंत्रित होते हैं। IANA time zone database पर प्रति वर्ष कई बार अपडेट जारी किए जाते हैं। PHP पक्ष पर, PHP documentation स्पष्ट करता है कि वर्तमान में कौन सा संस्करण उपलब्ध है, और यह अपडेट PECL's timezonedb के माध्यम से प्रबंधित किए जाते हैं - जो आईएएनए से इसका डेटा खींचता है।

"लोकप्रिय" के संबंध में - यह अत्यधिक व्यक्तिपरक भी है। टीजेडीडीबी में जोन एक कारण या किसी अन्य कारण के लिए हैं। एकमात्र जगह जो मुझे पता है कि इसे सीमित करने का प्रयास किया गया है, रेल पर रूबी से ActiveSupport::TimeZone है। वे दावा करते हैं कि "146 जोनों का सार्थक सबसेट" है, जिसे आप उस पृष्ठ पर निरंतर MAPPING में देख सकते हैं। लेकिन वे यह नहीं कहते कि उन्होंने किस प्रक्रिया को सार्थक माना है, और स्पष्ट चूक हैं। जब तक आप किसी तथ्य के बारे में नहीं जानते हैं, जहां आपके प्रत्येक उपयोगकर्ता में स्थित होगा, मैं यह तय करने का प्रयास नहीं करूंगा कि कौन से क्षेत्र सीमित हैं।

यदि आपका बाद अन्य कुछ है कि TZDB में सभी 578 क्षेत्रों में से एक ड्रॉपडाउन सूची, आप इन तरीकों में से एक कोशिश कर सकते हैं क्या है:

  • वर्तमान दो ड्रॉप-डाउन का। एक देश का चयन करने वाला पहला। दूसरे देश में एक क्षेत्र चुनने के लिए दूसरा। PHP में, आप देख सकते हैं कि जब आप DateTimeZone::listIdentifiers पर कॉल करते हैं, तो यह सूची फ़िल्टर करने के लिए वैकल्पिक $country पैरामीटर स्वीकार करता है।

    इस का एक अच्छा उदाहरण गूगल कैलेंडर के लिए सेटिंग्स में है:

    Google Calendar Time Zone Settings

  • तो अपने उपयोगकर्ता स्थान के आधार उनके समय क्षेत्र का चयन कर सकते हैं एक नक्शा आधारित नियंत्रण का प्रयोग करें। इनमें से बहुत सारे हैं, लेकिन जावास्क्रिप्ट के लिए मेरा पसंदीदा this one है।

    उदाहरण के लिए, यह इस प्रकार दिखाई देंगे:

    Map-based TZ picker

ध्यान दें कि जबकि यह EDT यहाँ की TZDB संक्षिप्त नाम से पता चलता - कि सिर्फ एक प्रदर्शन सुविधा के लिए प्रयोग किया जाता है। हुड के तहत, आप America/New_York जैसे मान का चयन कर रहे हैं।

आखिरकार, प्रत्येक उपयोगकर्ता के लिए आपको क्या सहेजने की आवश्यकता है, उनकी आईएएनए समय क्षेत्र कुंजी है, जैसे कि America/New_York। आप -5 के मूल्य के साथ सही समय क्षेत्र रूपांतरण नहीं कर सकते हैं, क्योंकि आपके पास -4 पर स्विच होने पर सभी नियम नहीं हैं।

अद्यतन

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

आप सभी वास्तव में उस पल के लिए ऑफसेट सही समय पर होने की स्थिति की आवश्यकता है। तो आप अपने प्रश्न में दिखाए गए एक ड्रॉपडाउन का उपयोग कर सकते हैं - लेकिन मैं किसी भी ज़ोन नाम को छोड़ दूंगा। यह UTC-12:00 से UTC+14:00 तक ऑफ़सेट की सूची होगी। ऐसा लगता है कि आपने पहले ही पहचान लिया है कि कुछ 30 मिनट और 45 मिनट की ऑफसेट भी मौजूद है। यदि आप चाहें तो आप अपनी धारणा here सत्यापित कर सकते हैं।

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

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

उदाहरण के लिए, मैं America/New_York का चयन कर सकता हूं, और 3 नवंबर 2013 को 1:00 बजे का समय चुन सकता हूं। इसमें गिरावट के संक्रमण के कारण दो अलग-अलग उदाहरण हैं (ईडीटी में -4 में एक और दूसरा ईएसटी -5)। तो आपके ऐप को इसकी जांच करनी होगी और उपयोगकर्ता से पूछें कि उनमें से कौन सा मतलब है। इसी तरह, अगर मैं मार्च को 10 वीं 2013 2:00 पूर्वाह्न दर्ज करते हैं, अपने अनुप्रयोग मुझे बताना चाहिए कि इस समय (वसंत आगे संक्रमण की वजह से) कि क्षेत्र में मौजूद नहीं है।

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

+1

वाह, महान जवाब। आप जीतते हैं, मैं पूरी चीज को ठीक कर दूंगा। निराश हालांकि यद्यपि मेरे उलटी गिनती टाइमर और मेरे सभी परीक्षणों में कम काम किया (कम से कम यूएस के भीतर)। मुझे बस उस समय के आगे एबीबीआर प्रदर्शित करने की जरूरत है। मुझे लगता है कि यह करने का यह एक बेहतर तरीका है। मैं जो कर रहा हूं वह लाइव इवेंट्स की तरह है, इसलिए उपयोगकर्ता में उनमें से कई हो सकते हैं, ऐसा नहीं है कि उपयोगकर्ता एक बार अपना टाइमज़ोन चुनता है और ऐसा ही है, यह कई बार हो सकता है और वे सभी देशों के लिए अन्य देशों में कई कार्यक्रम हो सकते हैं। पता है तो मैं इसे सरल रखना चाहता था। देश + टाइमज़ोन चयन अच्छी तरह से काम करना चाहिए। धन्यवाद! – ABlankenship

+0

इसके अलावा, आपके पिछले अनुच्छेद के अनुसार, मैंने जावास्क्रिप्ट को उपयोगकर्ता द्वारा समय-समय पर दिखाए जाने के द्वारा इसका समाधान किया, ताकि वे ईडीटी (यूटीसी) के लिए -4 चुन सकें, भले ही -5 उस क्षेत्र के लिए सही जीएमटी कोड है। थोड़ा सा हैकी लेकिन यह बदले जाने से पहले निकट भविष्य में आने वाली घटनाओं के लिए काम करता था। इस उद्देश्य के लिए – ABlankenship

+0

जीएमटी/यूटीसी समान हैं। ऐसा नहीं है -5 सही है, यह सिर्फ "मानक" या "आधार" ऑफ़सेट होता है। यहां तक ​​कि Google कैलेंडर उदाहरण मानक ऑफसेट दिखाकर यह गलत हो जाता है - वर्तमान में नहीं, या (आपके मामले में) जो ईवेंट समय पर लागू होता है। मेरा अद्यतन उत्तर भी देखें। –

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