2014-06-24 3 views
5

में नोडा टाइम iana मैपिंग मेरे पास एक वैश्विक वेबसाइट है जो सर्वर पर आईएएनए टाइमज़ोन आईडी पास कर रही है और सी # 5 वेब ऐप में विंडोज टाइमज़ोन में मैप करने के लिए नोडा टाइम का उपयोग कर रही है।एडीसी/यूटीसी के विंडोज़ टाइमज़ोन

"एटीसी/यूटीसी" सर्वर को पास किया जा रहा है लेकिन नोडा टाइम इसे विंडोज़ समय क्षेत्र में मैप नहीं कर सकता है। मैं एक आईएएनए टाइमज़ोन आईडी कैसे मैप कर सकता हूं?

public TimeZoneInfo GetTimeZoneByIanaId(string ianaTimeZoneId) 
{ 
    TzdbDateTimeZoneSource timeZoneSource = TzdbDateTimeZoneSource.Default; 
    IList<MapZone> zoneMaps = timeZoneSource.WindowsMapping.MapZones; 

    // resolve any link, since the CLDR doesn't necessarily use canonical IDs 
    IList<string> mapZoneIds = timeZoneSource.CanonicalIdMap.Where(map => map.Value.Equals(ianaTimeZoneId, StringComparison.OrdinalIgnoreCase)).Select(x => x.Key).ToList(); 
    MapZone mapZone = zoneMaps.FirstOrDefault(zoneMap => zoneMap.TzdbIds.Any(mapZoneIds.Contains)); 

    if (mapZone == null) 
    { 
     throw new TimeZoneNotFoundException("Unable to determine the clients timezone using the jsTimezoneDetect plugin"); 
    } 

    TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById(mapZone.WindowsId); 

    if (timeZone == null) 
    { 
     throw new TimeZoneNotFoundException("Unable to determine the clients timezone from NodaTime"); 
    } 

    return timeZone; 
} 
+0

https://code.google.com/p/noda-time/source/browse/data/cldr/windowsZones-25.xml पर देखकर, ऐसा लगता है कि यूटीसी की सीएलडीआर-परिभाषित मैपिंग नहीं है। आपको बस इसे हार्ड-कोड करने की आवश्यकता हो सकती है :( –

+0

ठीक है, धन्यवाद। हाँ, यह प्रविष्टि का मामला मानचित्र में मौजूद नहीं है :( –

उत्तर

7

जॉन के रूप में कहा, CLDR मानचित्रण नहीं वहाँ "Etc/UTC" के लिए है। इसके बजाय, सीएलडीआर विंडोज "UTC" समय क्षेत्र "Etc/GMT" पर मानचित्र करता है। आईएमएचओ - यह त्रुटि में है।

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

हालांकि - "Etc/UTC" के लिए एक लिंक होने के लिए TZDB "Etc/GMT" पर विचार नहीं करता है। वे दो अलग-अलग क्षेत्र हैं। "Etc/UCT" भी है। ऐसा इसलिए है कि समय क्षेत्र संक्षेप के लिए TZDB पर भरोसा करने वाले अनुप्रयोग संक्षेप में उनकी पसंद (जीएमटी, यूटीसी, या यूसीटी) का उपयोग कर सकते हैं। (See discussion here.)

वैसे भी - इस समस्या को याद दिलाने के लिए धन्यवाद। मैंने इसे ध्यान में रखने के लिए mapping functions को अपडेट किया।

+0

क्या आप किसी अन्य टाइमज़ोन मैपिंग के बारे में जानते हैं जो काम नहीं करते? – user3772576

+0

यह केवल एक ही मुझे पता है - कम से कम, यदि आप मेरे दूसरे उत्तर में मैपिंग फ़ंक्शंस का उपयोग करते हैं, तो यह सभी tzdb लिंक का पालन करने का प्रयास करता है। विसंगति इसलिए है क्योंकि सीएलडीआर के पास "कैननिकल" की तुलना में एक अलग विचार है tzdb। मैंने [कुछ विवरण यहां] जोड़ा है (https://code.google.com/p/noda-time/issues/detail?id=274) नोडा टाइम के अगले प्रमुख संस्करण के लिए विचार के साथ। –

+0

बहुत बढ़िया, मेरे पास वैश्विक उपयोगकर्ता आधार है और नोडटाइम ने टाइमज़ोन ऑफ़सेट के साथ कई समस्याओं का समाधान किया है। यह एक उत्कृष्ट समाधान है धन्यवाद – user3772576

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