2012-06-28 22 views
9

में जावास्क्रिप्ट दिनांक ऑब्जेक्ट समस्या मैं 2012-12-31 के प्रारूप में JSON ऑब्जेक्ट से एक तारीख ले रहा हूं और इसे अनुकूल मानों में परिवर्तित करने और इसे आउटपुट करने की कोशिश कर रहा हूं।सफारी और आईई

var redeemableDate = item.Deal.RedeemableDate; //this is coming in the form of 2012-12-31 
    var redeemableDate = new Date(redeemableDate); 
    var rdDay = weekday[redeemableDate.getDay()]; //using an array with weekdays 
    var rdDate = redeemableDate.getDate(); 
    var rdMonth = monthNames[redeemableDate.getMonth()]; //using an array with month names 
    var rdYear = redeemableDate.getFullYear(); 

    response.write('Valid ' + rdDay + ' ' + rdDate + ' ' + rdMonth + ' ' + rdYear + ' ONLY'); 

यह सब काम करता है खोजने के लिए और फ़ायरफ़ॉक्स और क्रोम में dandy, लेकिन सफारी और IE (केवल IE8 अब तक पर परीक्षण) यह पसंद नहीं है।

मान्य रविवार 2 सितंबर 2012 केवल

लेकिन सफारी और IE में, मैं:

मान्य अपरिभाषित NaN अपरिभाषित

एफएफ और क्रोम में मैं उम्मीद मिलता है NaN केवल

जब मैं लाल चेतावनी देता हूं eemableDate जब मैंने इसे डेट ऑब्जेक्ट के रूप में सेट किया है, तो सफारी 'अमान्य तिथि' देता है और आईई 'NaN' देता है। यह स्पष्ट रूप से मुद्दा है जहां मुद्दा है। क्या कोई तरीका है कि मैं इन ब्राउज़रों के लिए डेट ऑब्जेक्ट में अपना मान प्राप्त कर सकता हूं?

उत्तर

24

वाईरी-एमएम-डीडी (आईएसओ 8601) दिनांक प्रारूप सफारी और आईई में समर्थित नहीं है। यह ईसीएमएस्क्रिप्ट 5 का हिस्सा है हालांकि, यह सिर्फ समय की बात होनी चाहिए।

एक समाधान तारीख को तर्क के रूप में तिथि को पारित करना होगा।

var date = "2012-12-31".split("-"); 
var your_date = new Date(date[0], date[1]-1, date[2]); 

ध्यान दें कि महीने के पैरामीटर शून्य पर (जनवरी के लिए) शुरू होता है, तो आप स्ट्रिंग से प्राप्त मूल्य से 1 घटाना चाहिए।

संपादित करें: शॉर्टकट के लिए नीचे जो लार्सन द्वारा उत्तर देखें।

+0

सरल और मीठा समाधान :) –

+10

'var your_date = new date (dateString.split (" - ")। ("/") में शामिल हों;' – jlarson

+0

अच्छा एक जो! मैं अपना जवाब अपडेट करूंगा। – jack

6

आप पार्स करने की तारीख स्ट्रिंग खुद से बेहतर कर रहे हैं:

function dateFromISO(str) { 
    var d = null; 
    str.replace(/^(\d\d\d\d)-(\d\d)-(\d\d)$/, function(_, y, m, d) { 
    d = new Date(parseInt(y, 10), parseInt(m, 10) - 1, parseInt(d, 10)); 
    }); 
    return d; 
} 

redeemableDate = dateFromISO(redeemableDate); 

यहां तक ​​कि अगर अन्य ब्राउज़रों उन तिथि तार पसंद आया, आप उनमें से समस्या हमेशा यूटीसी के रूप में व्याख्या की जा रही होगा। मेरे लिए, उदाहरण के लिए, जब मैं फ़ायरफ़ॉक्स में "2012-12-31" उस स्ट्रिंग को पास करता हूं, तो यह मुझे बताता है कि दिनांक 30 दिसंबर 2012 है, क्योंकि मैं यूटीसी के पीछे 6 घंटे हूं। दूसरे शब्दों में, "2012-12-31" का अर्थ उस तारीख के मध्यरात्रि के रूप में किया जाता है, यूटीसी समय। मान लीजिए कि आप दुनिया में सभी को सही तिथि देखने के लिए चाहते हैं, यदि आप डेट ऑब्जेक्ट को संख्याओं के साथ बनाते हैं तो इसे क्लाइंट में स्थानीय समय माना जाता है।

1

पुराने इंटरनेट एक्सप्लोरर संस्करण (और स्पष्ट रूप से सफारी का आपका संस्करण) एक yyyy-mm-dd स्ट्रिंग को पार्स नहीं करेगा, जैसे कि new Date('2012-12-31')

एक और विकल्प jQuery.datepicker.parseDate() है, हालांकि यह थोड़ा अधिक हो सकता है।

-1

एक PHP वेब सेवा का उपयोग करने के मामले में, मैं सफारी/यानी के साथ सामान्य कार्यक्षमता रखने के लिए $row['date'] = date('j/n/Y',strtotime($row['date'])); का उपयोग करके अपनी तिथियां वापस करने की अनुशंसा करता हूं।

2

जैक और जो लार्सन की प्रतिक्रिया का मेल, निम्नलिखित कोड मेरे लिए अच्छी तरह से काम:

 $scope.formatDate = function(date){ 
       var date = date.split("-").join("/"); 
       var dateOut = new Date(date); 
       return dateOut; 
     }; 

क्रोम और सफारी के लिए अच्छी तरह से काम ...:)
धन्यवाद जैक और जो लार्सन !!!

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