2010-06-21 6 views
35

एक परियोजना में मैं पर काम कर रहा हूँ, मैं के बजाय NaN लौटने एक तारीख एक <input type="date">सफारी जेएस YYYY-MM-DD दिनांक प्रारूप को पार्स नहीं कर सकता है?

सफारी 4/5 (पर मैक OSX) जावास्क्रिप्ट प्रारूप YYYY-MM-DD की तारीखों को पार्स करने में विफल रहता है के साथ

में प्रवेश को मान्य करने की जरूरत है, अपेक्षित युग टाइमस्टैंप।

मैं निम्नलिखित तकनीक का उपयोग कर रहा क्षेत्र के ठीक पहले फ़ॉर्म सबमिट किया जाता मान्य करने के लिए: (

//value = '2010-06-21' 
var stamp = Date.parse(value); 
if (isNaN(stamp)) { 
    //notify user 
} else { 
    value = new Date(stamp).format_mysql(); 
} 

कहाँ format_mysql() एक प्रोटोटाइप समारोह उस तारीख (सही) MySQL दिनांक समय प्रारूप में प्रारूप है YYYY- MM-DD)।

s '/ साथ s' - की जगह (YYYY/MM/DD) पैदावार एक "सही" टाइमस्टैम्प।

मैं नोट करना चाहिए कि क्षेत्र में किसी भी दिनांक स्वरूप ही नहीं, YYYY-MM-DD को स्वीकार करना चाहिए, और हालांकि मैं, मैं Date.js तरह पुस्तकालयों का उपयोग नहीं कर सकते हैं चाहते हैं

कैसे मैं इसे ठीक कर सकते हैं कि , या किसी तारीख को पार्स/मान्य करने का कोई बेहतर तरीका है?

+0

मेरे पास सफारी 5.17 है, और यह मेरे लिए ठीक काम करता है (आईओएस 5.12 पर भी परीक्षण किया गया): कब = Date.parse ("2013-01-29 08:30"); – Orwellophile

+0

'दिनांक()' कन्स्ट्रक्टर द्वारा स्वीकार किए गए तार ब्राउज़र में भिन्न होते हैं, लेकिन सबसे सुरक्षित व्यक्ति YYYY/MM/DD लगता है - http://dygraphs.com/date-formats.html देखें। – Noyo

उत्तर

57

Date.parse विधि का व्यवहार ईसीएमएस्क्रिप्ट 5 पर लागू कार्यान्वयन है, यह विधि ISO8601 स्वरूपित तिथियों को पार्स कर सकती है, लेकिन मैं आपको पार्सिंग मैन्युअल रूप से बनाने की सलाह दूंगा।

कुछ समय पहले मैं एक साधारण समारोह कर दिया है, कि एक फॉर्मेट स्पेसिफायर तर्क संभाल कर सकते हैं:

function parseDate(input, format) { 
    format = format || 'yyyy-mm-dd'; // default format 
    var parts = input.match(/(\d+)/g), 
     i = 0, fmt = {}; 
    // extract date-part indexes from the format 
    format.replace(/(yyyy|dd|mm)/g, function(part) { fmt[part] = i++; }); 

    return new Date(parts[fmt['yyyy']], parts[fmt['mm']]-1, parts[fmt['dd']]); 
} 

parseDate('06.21.2010', 'mm.dd.yyyy'); 
parseDate('21.06.2010', 'dd.mm.yyyy'); 
parseDate('2010/06/21', 'yyyy/mm/dd'); 
parseDate('2010-06-21'); 

इसके अलावा, आप ECMAScript 5 आईएसओ स्वरूपित दिनांकों पार्स करने के लिए व्यवहार का पता लगा सकता है, तो आप देख सकते हैं कि Date.prototype.toISOString उपलब्ध है, जैसे:

if (typeof Date.prototype.toISOString == "function") { 
    // ES5 ISO date parsing available 
} 
+3

+1, आपने मुझे इसे हराया। ओपी को सलाह के रूप में, मैं उस स्थिति से बचने के लिए तारीखों के लिए एक इनपुट तत्व से दूर जाने पर विचार करता हूं जहां उपयोगकर्ता अपने लोकेल में दिनांक इनपुट करता है (उदाहरण के लिए डीडी और मिमी मिश्रण)। या तो वह केवल पढ़ने के लिए इनपुट और एक तारीख पिकर नियंत्रण का उपयोग करें। –

+0

जब तक मैं गलत तरीके से समझ नहीं पाता, तब तक आपका कार्य केवल तब लागू होगा जब मैं हाथ से पहले प्रारूप प्रारूप को जानता हूं, सही? @ एंडी ई का सिर: अलग इनपुट एक अच्छा विचार है, और कुछ जो मैं देखता हूं। पारितोषिक के लिए धन्यवाद। –

+0

@ ऑस्टिन, हां, आपको प्रारूप को किसी भी तरह से जानना है, अन्यथा आपके पास बहुत सारी अस्पष्टताएं होंगी, उदा। '01/02/2010" 'बनाम' 02/01/2010 "', कौन सा 2 जनवरी, और कौन सा फरवरी 1 है? – CMS

3

क्षेत्र किसी भी दिनांक स्वरूप को स्वीकार करना चाहिए

आप का मतलब यह नहीं है कि आप क्या सोचते हैं।

  • एम/डी/वाई (यूएस) और डी/एम/वाई (यूके) के बीच भरोसेमंद अंतर करना मुश्किल है। ब्रिटेन में डीएमवाई अधिक आम है, लेकिन किसी भी तरह से सार्वभौमिक नहीं है।
  • 1600 से पहले तिथियों के साथ शुभकामनाएं - ग्रेगोरियन (सौर) कैलेंडर 1582 में पेश किया गया था, और 20 वीं शताब्दी में (केवल विकिपीडिया) अपनाया गया था (विकिपीडिया 1 9 2 9)। 30 फरवरी स्वीडन की वैध तिथि थी।
  • ओएस एक्स आपको 13 (!) कैलेंडर का विकल्प देता है, हालांकि डिफ़ॉल्ट ग्रेगोरियन है।

इसके बजाय, मैं कैलेंडर विजेट का उपयोग करने की सलाह देता हूं। मुझे लगता है कि JQuery एक है, लेकिन आईसीबीडब्ल्यू।

+1

ठीक है, मैं काफी छोटे अमेरिकी दर्शकों को लक्षित कर रहा हूं, 2000+ की तारीखों को देखते हुए, और ग्रेगोरियन कैलेंडर की संभावना से अधिक। हां, jQuery के यूआई पैकेज के हिस्से के रूप में डेटपिकर विजेट है, लेकिन मैं इसका उपयोग नहीं कर सकता :(। जब मैं कहता हूं "कोई दिनांक प्रारूप" मेरा मतलब है "21 जून, 2010", "6/21/10", "2010- 06-21 ", आदि सभी एक ही तारीख का प्रतिनिधित्व करते हैं। –

+0

यदि आपका मतलब है" अमेरिका में कोई अस्पष्ट आम तिथि प्रारूप ", तो आपको शायद अपना खुद का लिखना होगा। –

1

आप इनपुट, से एक स्पष्ट तारीख प्राप्त कर सकते हैं लेकिन आप अभी भी यह जांच करने की आवश्यकता है, तो एक उपयोगकर्ता आप अप्रैल 31.

<fieldset id= "localdate"> 
<select id= "monthselect" size= "1"> 
<option selected= "selected"> January</option> 
<option> February</option> 
<option> March</option> 
<option> April</option> 
<option> May</option> 
<option> June</option> 
<option> July</option> 
<option> August</option> 
<option> September</option> 
<option> October</option> 
<option> November</option> 
<option> December</option> 
</select> 
<label> Date: <input name= "inputdate" size= "2" value= "1"> </label> 
<label> Year: <input name= "inputyear" size= "4" value= "2010"> </label> 
</fieldset> 

दस्तावेज़ के लिए शॉर्टकट नहीं देता है।getElementsByName

फ़ंक्शन द्वारा नाम (एस, एन) { n = n || 0; रिटर्न दस्तावेज़ .getElementsByName (n]; }

function getDateInput(){ 
    var day, y= parseInt(byName('inputyear').value), 
    m= byName('monthselect').selectedIndex, 
    d= parseInt(byName('inputdate').value); 

    if(!y || y<1000 || y> 3000) throw 'Bad Year '+y; 
    if((!d || d<1 || d> 32) throw 'Bad Date '+d; 
    day= new Date(y,m,d); 
    if(day.getDate()!= d) throw 'Bad Date '+d; 
    value= day.format_mysql(); 
} 

आप आज की तारीख ऑनलोड

onload= function(){ 
    var now= new Date(); 
    byName('inputyear').value= now.getFullYear(); 
    byName('monthselect').selectedIndex= now.getMonth(); 
    byName('inputdate').value= now.getDate(); 
} 
9

आम तौर पर डीडी-MM-YYYY स्वरूप को प्रतिबिंबित करने के सफारी में समर्थन नहीं कर रहा है क्षेत्रों पूर्व निर्धारित कर सकते हैं।

मूल्य = 2010/06/21; //कार्य करना चाहिए।

(या)

मूल्य = new Date ('2010-06-21'.replace (/ -/जी, "/"));

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