2009-08-13 23 views
17

मेरे पास एक परिदृश्य है जहां मेरे पास टाइमज़ोन ऑफसेट है (मिनटों में) और इसके लिए टाइमज़ोन निर्धारित करने की आवश्यकता है। मुझे पता है कि सभी डेटा उपलब्ध नहीं है (उदाहरण के लिए, -240 मिनट के ऑफसेट के साथ कई टाइमज़ोन हो सकते हैं) लेकिन "सर्वश्रेष्ठ अनुमान" स्वीकार्य है।मैं यूटीसी ऑफसेट द्वारा टाइमज़ोन कैसे निर्धारित कर सकता हूं?

मेरी पहली पास इस तरह देखा:

foreach (var info in TimeZoneInfo.GetSystemTimeZones()) 
{ 
    if (info.BaseUtcOffset.TotalMinutes == timezoneOffset) 
    { 
     // do something here if this is a valid timezone 
    } 
} 

यह sorta काम करता है, लेकिन मैं डेलाइट सेविंग जो मुझे कुछ हद तक दूर फेंक रहा है के लिए खाते में करने की जरूरत है। मैं इस भयानक हैक कहा:

foreach (var info in TimeZoneInfo.GetSystemTimeZones()) 
{ 
    var extra = info.IsDaylightSavingTime(DateTime.Now) ? 60 : 0; 
    if (info.BaseUtcOffset.TotalMinutes + extra == timezoneOffset) 
    { 
     // do something here if this is a valid timezone 
    } 
} 

यह है कि में "अच्छी तरह से" काम करता है मैं उपयोगकर्ता उनके लिए सही समय दिखा सकते हैं जब दिन के उजाले बचत प्रभाव में नहीं है और डीएसटी के दौरान लगभग 70% सही कर रहा हूँ। फिर भी ... यह मेरी आंखों के लिए कुछ भयानक कोड है।

क्या ऐसा करने का कोई बेहतर तरीका है? अधिक लालित्य अच्छा होगा, और अधिक सटीकता अभी भी बेहतर होगी।

अद्यतन

तकनीकी तौर पर मैं किसी भी जानकारी जावास्क्रिप्ट तारीख के बारे में प्राप्त कर सकते हैं की पहुंच है। मेरे पास एक पृष्ठ है जिस पर मैंने "ऑफसेट" नामक एक छिपे हुए क्षेत्र को रखा है। मेरे पास एक JQuery फ़ंक्शन है जो ऑफ़सेट फ़ील्ड को डेटटाइम() के साथ पॉप्युलेट करता है। GetTimezoneOffset()। जबकि मुझे डेटटाइम ऑब्जेक्ट पर कुछ भी दिखाई नहीं देता है जो मदद करेगा, शायद यह विचारों के लिए अन्य मार्ग खोल देगा।

+0

@ सेलिंग जूडो: मैंने अपने उत्तर में कुछ कोड जोड़ा है, जो जावास्क्रिप्ट को एक सार्वभौमिक टाइमस्टैम्प को स्थानीय में परिवर्तित करने देता है। – Kip

उत्तर

16

संक्षिप्त उत्तर: आप नहीं कर सकते।

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

यह भी मुद्दा है कि विभिन्न देशों में डीएसटी का क्या समय लगता है। उदाहरण के लिए, यूएस डीएसटी में पहले शुरू होता है और बाद में यूरोप में समाप्त होता है।

एक करीबी अनुमान संभव है (यानी +/- एक घंटा), लेकिन यदि आप उपयोगकर्ताओं को समय प्रदर्शित करने के लिए इसका उपयोग कर रहे हैं तो आप अनिवार्य रूप से उनमें से कुछ को गलत समय प्रदर्शित करेंगे।


अद्यतन: टिप्पणियों से, ऐसा लगता है कि अपने प्राथमिक लक्ष्य उपयोगकर्ता के स्थानीय समय क्षेत्र में समय स्टांप प्रदर्शित करने के लिए है की तरह। यदि आप यही करना चाहते हैं, तो आपको समय को यूटीसी टाइमस्टैम्प के रूप में भेजना चाहिए, और उसके बाद इसे जावास्क्रिप्ट के साथ उपयोगकर्ता के ब्राउज़र पर फिर से लिखना चाहिए। इस मामले में उनके पास जावास्क्रिप्ट सक्षम नहीं है, फिर भी वे एक प्रयोग योग्य यूटीसी टाइमस्टैम्प देखेंगे। यहां एक फ़ंक्शन है जो मैं this question में आया था, जिसे मैंने this Greasemonkey script में उपयोग किया था। आप अपनी आवश्यकताओं के अनुरूप इसे बदलना चाह सकते हैं।

//@param timestamp An ISO-8601 timestamp in the form YYYY-MM-DDTHH:MM:SS±HH:MM 
//Note: Some other valid ISO-8601 timestamps are not accepted by this function 
function parseISO8601(timestamp) 
{ 
    var regex = new RegExp("^([\\d]{4})-([\\d]{2})-([\\d]{2})T([\\d]{2}):([\\d]{2}):([\\d]{2})([\\+\\-])([\\d]{2}):([\\d]{2})$"); 
    var matches = regex.exec(timestamp); 
    if(matches != null) 
    { 
    var offset = parseInt(matches[8], 10) * 60 + parseInt(matches[9], 10); 
    if(matches[7] == "-") 
     offset = -offset; 

    return new Date(
     Date.UTC(
     parseInt(matches[1], 10), 
     parseInt(matches[2], 10) - 1, 
     parseInt(matches[3], 10), 
     parseInt(matches[4], 10), 
     parseInt(matches[5], 10), 
     parseInt(matches[6], 10) 
    ) - offset*60*1000 
    ); 
    } 
    return null; 
} 

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

var weekDays = new Array("Sunday", "Monday", "Tuesday", "Wednesday", 
     "Thursday", "Friday", "Saturday"); 
var months = new Array("January", "February", "March", "April", "May", "June", 
     "July", "August", "September", "October", "November", "December"); 

function toLocalTime(date) 
{ 
    var hour = date.getHours(); 
    var ampm = (hour < 12 ? "am" : "pm"); 
    hour = (hour + 11)%12 + 1; 

    var minutes = date.getMinutes(); 
    if(minutes < 10) 
    minutes = "0" + minutes; 

    return weekDays[date.getDay()] + ", " 
     + months[date.getMonth()] + " " 
     + date.getDate()   + ", " 
     + date.getFullYear()  + " at " 
     + hour     + ":" 
     + minutes     + " " 
     + ampm; 
} 
+0

यह सच है, अकेले ऑफसेट समय क्षेत्र निर्धारित करने के लिए पर्याप्त जानकारी नहीं है। कोई अन्य जानकारी जो आपके पास है? क्या आप एक समय क्षेत्र के लिए एक उपयोगकर्ता से पूछ सकते हैं? –

+0

@ मैट: तकनीकी रूप से मुझे कुछ भी एक्सेस हो सकता है जावास्क्रिप्ट मुझे बता सकता है लेकिन मुझे जावास्क्रिप्ट डेटटाइम ऑब्जेक्ट पर कुछ भी दिखाई नहीं देता है जो क्लाइंट वर्तमान में डीएसटी में है या नहीं। –

+0

@ मैट: साथ ही, यह पूरा व्यायाम उपयोगकर्ता को जानकारी के लिए परेशान नहीं करने का प्रयास है यदि मैं इसे अपने लिए प्राप्त कर सकता हूं। चूंकि एक टाइमज़ोन के लिए उपयोगकर्ता पूर्ण अंतिम उपाय है। वास्तव में, टाइमज़ोन पर * अधिक * सटीक अनुमान होने से सीधे पूछने से बेहतर होता है (मेरे मामले में)। –

5

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

1

कुछ चालबाजी के साथ आप 99% सही हो सकते हैं, और अन्य 1% को बंद कर सकते हैं। बेहद पूर्ण कार्यान्वयन के लिए jstimezonedetect देखें।

एक गरीब व्यक्ति का दृष्टिकोण प्रत्येक संभावित रिपोर्ट किए गए टाइमज़ोन ऑफसेट को मैन्युअल रूप से अपने सर्वोत्तम अनुमान के लिए मैप करना होगा। चूंकि आप अनुमान लगा रहे हैं कि आप इसके बारे में भी स्पष्ट हो सकते हैं!

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