2013-02-17 23 views
8

भागो इस jsfiddle: http://jsfiddle.net/E9gq9/7/ क्रोम, एफएफ, और IE और आप पर मिलता है:क्रोम बिना आईटीसी के आईएसओ के आईएसओ समय की व्याख्या करता है; सी # मुद्दा

क्रोम:

Chrome http://images.devs-on.net/Image/vBTz86J0f4o8zlL3-Region.png

फ़ायरफ़ॉक्स:

Firefox http://images.devs-on.net/Image/aNPxNPUpltyjVpSX-Region.png

आईई:

IE http://images.devs-on.net/Image/WXLM5Ev1Viq4ecFq-Region.png

सफारी:

Safari http://images.devs-on.net/Image/AEcyUouX04k2yIPo-Region.png

ISO 8601 कहने के लिए कैसे एक अनुगामी जेड के बिना एक स्ट्रिंग व्याख्या की जानी चाहिए प्रकट नहीं होता है।

हमारा सर्वर (एएसपी.नेट एमवीसी 4) DateTime एस के रूप में हमारे डेटाबेस से यूटीसी टाइम्स खींच रहा है और बस उन्हें JSON में भर रहा है। जैसा कि आप देख सकते हैं क्योंकि हम ब्राउज़र पर असंगत परिणाम प्राप्त कर रहे हैं।

क्या हमें बस सर्वर पक्ष पर ज़ेड संलग्न करना चाहिए?

+0

ओपेरा क्रोम बीटीडब्ल्यू की तरह करता है। – Bergi

उत्तर

10

क्रोम यूटीसी के रूप में जेड के बिना आईएसओ समय की व्याख्या; सी # अंक

जो सही है, यह फ़ायरफ़ॉक्स और आईई है जो इसे गलत कर रहा है।

लेख आप लिंक किए गए वास्तव में कहना है जबकि इसका क्या मतलब है जब कोई Z ("कोई यूटीसी संबंध में जानकारी के लिए एक समय प्रतिनिधित्व के साथ दिया जाता है, तो समय स्थानीय समय में माना जाता है।"), और अधिक महत्वपूर्ण बात यह है कि ECMAScript5 specification काफी स्पष्ट रूप है कि कोई समय क्षेत्र जानकारी का मतलब Z कहते है:

ऑफसेट एक अनुपस्थित समय क्षेत्र का मान "Z" है।

हां, मुझे शायद यह सुनिश्चित होगा कि स्ट्रिंग में Z है, जैसा कि आपको लगातार परिणाम मिलते हैं।

+0

हालांकि, आपको यह भी ध्यान देना चाहिए कि [पुराना आईईएस पूरी तरह से आईएसओ 8601 पार्स करने में विफल रहता है] (http://msdn.microsoft.com/en-us/library/ie/ff743760 (v = vs.94) .aspx)। जेएस डेट पार्सिंग में कुछ भी सुसंगत नहीं है :-( – Bergi

+5

वाह। यह निश्चित रूप से ईसीएमएस्क्रिप्ट स्पेक कहता है - लेकिन यह बहुत टूटा हुआ है, आईएमओ - और सीधे आईएसओ -8601 के खिलाफ, जो कहता है: "ज़ोन डिज़ाइनर खाली है अगर स्थानीय से उपयोग किया जाता है 4.2.2.2 के माध्यम से 4.2.2.4 के अनुसार समय। "श्वास, आपको याद है कि यह समय पर बस एक पल के रूप में पार्स किया जा रहा है, मैं तर्क दूंगा कि पूरी एपीआई टूट गई है। डबल श्वास –

+0

@ बर्गि: यह है क्योंकि यह ईसीएमएस्क्रिप्ट 5 के रूप में नया है। आश्चर्यजनक रूप से, यहां तक ​​कि ईसीएमएस्क्रिप्ट 3 ने ** किसी भी ** दिनांक/समय स्ट्रिंग को निर्देशित नहीं किया था जिसे किसी इंजन को पार्स करना था, यह कहने के अलावा कि उसे 'दिनांक # toString' स्पॉट आउट करना पड़ेगा - - लेकिन यह उस चीज को निर्देशित नहीं करता था। अच्छी खबर यह है कि कोई बड़ा ब्राउज़र नहीं है जो 'yyyy/MM/dd' (' '' '' '' '' '' '' नहीं होना चाहिए), भले ही यह कभी मानकीकृत नहीं किया गया था। बुरी खबर यह है कि विभिन्न ब्राउज़र अलग-अलग कॉल करते हैं कि क्या यह स्थानीय या यूटीसी होना चाहिए। –

5

दिन के अंत में, इस ऐप में जिस समस्या का सामना करना पड़ रहा है, उसे ठीक किया जा सकता है यदि मेरा सर्वर हमेशा क्लाइंट डेटटाइम ऑब्जेक्ट्स को प्रारूप में भेजता है जो सभी ब्राउज़र सही तरीके से सौदा करते हैं।

इसका मतलब है कि अंत में 'जेड' होना चाहिए। एएसपी.नेट एमवीसी 4 जेसन सीरिएलाइज़र जेएसएन.नेट पर आधारित है, लेकिन डिफ़ॉल्ट रूप से यूटीसी चालू नहीं है। DateTimeZoneHandling के लिए डिफ़ॉल्ट RoundtripKind प्रतीत होता है और यह उन पर ज़ेड के साथ मानों को आउटपुट नहीं करता है, भले ही DateTime.Kind == Utc, जो काफी परेशान है।

तो फिक्स प्रतीत होता है, जेसन के रास्ते को सेट करें।नेट DateTimeZoneHandling.Utc को समय-क्षेत्रों संभालता है:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
// Force Utc formatting ('Z' at end). 
json.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc; 

अब, सब कुछ नीचे तार अपने सर्वर से आ रही करने के लिए ब्राउज़र अंत में एक 'Z' के साथ आईएसओ 8601 के रूप में स्वरूपित है। और जिन सभी ब्राउज़रों के साथ मैंने परीक्षण किया है, वे इसके साथ सही काम करते हैं।

+0

+1 यह वही था जो मैं ढूंढ रहा था। –

2

मैं इस समस्या में भाग गया, और स्थानीय टाइमज़ोन के साथ तिथि को समझने से कम से कम मेरे आवेदन के लिए "ज़ेड" में बदलने की तुलना में बहुत अधिक समझदारी हुई। मैंने आईएसओ तिथि में अनुपलब्ध होने पर स्थानीय टाइमज़ोन जानकारी को जोड़ने के लिए इस फ़ंक्शन को बनाया है। इसका उपयोग नई तिथि() के स्थान पर किया जा सकता है। आंशिक रूप से इस सवाल का जवाब से ली गई: How to ISO 8601 format a Date with Timezone Offset in JavaScript?

parseDate = function (/*String*/ d) { 
    if (d.search(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$/) == 0) { 
     var pad = function (num) { 
      norm = Math.abs(Math.floor(num)); 
      return (norm < 10 ? '0' : '') + norm; 
     }, 
     tzo = -(new Date(d)).getTimezoneOffset(), 
     sign = tzo >= 0 ? '+' : '-'; 
     return new Date(d + sign + pad(tzo/60) + ':' + pad(tzo % 60)); 
    } else { 
     return new Date(d); 
    } 
} 
0

डेविड हेमंड के answer महान है लेकिन सभी चाल चल नहीं करता है; इसलिए यहाँ एक संशोधित संस्करण है:

  • दिनांक/समय स्ट्रिंग में आंशिक हिस्सा
  • दिन के उजाले की बचत समय पार समझता दिनांक/समय स्ट्रिंग में वैकल्पिक सेकंड के लिए अनुमति देता है के लिए अनुमति देता
appendTimezone = function (/*String*/ d) { 
    // check for ISO 8601 date-time string (seconds and fractional part are optional) 
    if (d.search(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d{1-3})?)?$/) == 0) { 
     var pad = function (num) { 
      norm = Math.abs(Math.floor(num)); 
      return (norm < 10 ? '0' : '') + norm; 
     }, 
     tzo = -new Date(d).getTimezoneOffset(), 
     sign = tzo >= 0 ? '+' : '-'; 

     var adjusted = d + sign + pad(tzo/60) + ':' + pad(tzo % 60); 

     // check whether timezone offsets are equal; 
     // if not then the specified date is just within the hour when the clock 
     // has been turned forward or back 
     if (-new Date(adjusted).getTimezoneOffset() != tzo) { 
      // re-adjust 
      tzo -= 60; 
      adjusted = d + sign + pad(tzo/60) + ':' + pad(tzo % 60); 
     } 

     return adjusted; 
    } else { 
     return d; 
    } 
} 

parseDate = function (/*String*/ d) { 
    return new Date(appendTimezone(d)); 
}