2010-02-02 8 views
70

में काम करता है मैं जावास्क्रिप्ट में थोड़ा कैलेंडर बनाने की कोशिश कर रहा हूं। मेरे पास फ़ायरफ़ॉक्स और क्रोम में बहुत अच्छी काम कर रही है, लेकिन आईई में डेट फ़ंक्शन NaN लौट रहे हैं।दिनांक निर्माता आईई में NaN देता है, लेकिन फ़ायरफ़ॉक्स और क्रोम

function buildWeek(dateText){ 
    var headerDates=''; 
    var newDate = new Date(dateText); 

    for(var d=0;d<7;d++){ 
     headerDates += '<th>' + newDate + '</th>'; 
     newDate.setDate(newDate.getDate()+1); 
    }      

    jQuery('div#headerDates').html('<table><tr>'+headerDates+'</tr></table>'); 
} 

dateText वर्तमान सप्ताह जो वास्तव में 'मी, डी, वाई' के प्रारूप में php में सेट किया गया है की सोमवार, उदहारण के लिए:

यहाँ समारोह है "02, 01, 2010"

+2

आप अपने कोड नमूने पर कुछ कॉपी-पेस्ट त्रुटियाँ हैं बयान के लिए देखो: 'के लिए (वर घ = 0; d ';' कि बढ़ा देंगे एक 'SyntaxError' ... – CMS

उत्तर

62

दिनांक निर्माता किसी भी मूल्य को स्वीकार करता है। यदि तर्क का आदिम [[मान]] संख्या है, तो बनाई गई तिथि में वह मान है। यदि आदिम [[मूल्य]] स्ट्रिंग है, तो विनिर्देश केवल गारंटी देता है कि दिनांक कन्स्ट्रक्टर और पार्स विधि Date.prototype.toString और Date.prototype.toUTCString()

एक विश्वसनीय तरीका के परिणाम को पार्स करने में सक्षम हैं एक तिथि निर्धारित करने के लिए एक बनाना है और setFullYear और setTime विधियों का उपयोग करना है।

कि का एक उदाहरण यहां प्रकट होता है: http://jibbering.com/faq/#parseDate

ECMA-262 R3 किसी भी तिथि प्रारूप को परिभाषित नहीं करता। तिथि कन्स्ट्रक्टर या Date.parse को स्ट्रिंग मान पास करना कार्यान्वयन-निर्भर परिणाम है। यह सबसे अच्छा बचा है।


संपादित करें: comp.lang.javascript पूछे जाने वाले प्रश्न से प्रविष्टि है: एक विस्तारित आईएसओ 8601 स्थानीय दिनांक स्वरूप YYYY-MM-DD निम्नलिखित के साथ एक Date को पार्स नहीं किया जा सकता है: -

/**Parses string formatted as YYYY-MM-DD to a Date object. 
* If the supplied string does not match the format, an 
* invalid Date (value NaN) is returned. 
* @param {string} dateStringInRange format YYYY-MM-DD, with year in 
* range of 0000-9999, inclusive. 
* @return {Date} Date object representing the string. 
*/ 

    function parseISO8601(dateStringInRange) { 
    var isoExp = /^\s*(\d{4})-(\d\d)-(\d\d)\s*$/, 
     date = new Date(NaN), month, 
     parts = isoExp.exec(dateStringInRange); 

    if(parts) { 
     month = +parts[2]; 
     date.setFullYear(parts[1], month - 1, parts[3]); 
     if(month != date.getMonth() + 1) { 
     date.setTime(NaN); 
     } 
    } 
    return date; 
    } 
+0

धन्यवाद गेटेट। यह लिंक जो आपने लिंक में प्रदान किया है, वह किसी और चीज की तुलना में सबसे ज्यादा संक्षिप्त है, जिसे मैं ढूंढने में सक्षम हूं, और यह उस दिनांक प्रारूप के साथ काम करता है जिसका उपयोग मैं 99% ऐप के माध्यम से करता हूं! इससे कहीं अधिक संगत मैं उपयोग कर रहा था। – pedalpete

+0

यह, अच्छा नहीं है, क्योंकि कई संरचित प्रारूप सिर्फ W3C दिनांक/समय फॉर्म का उपयोग करते हैं टीएस (पूर्ण चश्मा या तो के साथ आईएसओ -8601)। इसलिए टाइमस्टैम्प कई तरीकों से बेहतर होते हैं (सरल, अधिक कुशल, सभी ब्राउज़रों के साथ काम करते हैं), अक्सर यह आवश्यक होता है कि मानक दिनांक/समय डेटा जावास्क्रिप्ट से पार्सर है। मुझे आश्चर्य है कि jQuery या ऐसे में बेहतर पार्सिंग विधियां होंगी। – StaxMan

+3

पॉइंटिंग के लिए धन्यवाद, पागल हो रहा है क्यों क्रोम ठीक पार्सिंग तिथियों का काम करता है जबकि i7 नैन कह रहा है, अच्छी बात $ .datepicker.parseDate jquery से दिनांक –

0

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

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

+4

ज्यादा है बहुत स्पष्ट है, लेकिन यह जानना अच्छा होगा कि समर्थित प्रारूप क्या हो सकते हैं ... – StaxMan

1

दिनांक टेक्स्ट और प्रारूप भेजें जिसमें आप नीचे दी गई विधि में डेटाटेक्स्ट भेज रहे हैं। यह पार्स और तारीख के रूप में वापस आ जाएगा और यह ब्राउज़र से स्वतंत्र है।

function cal_parse_internal(val, format) { 
val = val + ""; 
format = format + ""; 
var i_val = 0; 
var i_format = 0; 
var x, y; 
var now = new Date(dbSysCurrentDate); 
var year = now.getYear(); 
var month = now.getMonth() + 1; 
var date = now.getDate(); 

while (i_format < format.length) { 
    // Get next token from format string 
    var c = format.charAt(i_format); 
    var token = ""; 
    while ((format.charAt(i_format) == c) && (i_format < format.length)) { 
     token += format.charAt(i_format++); 
    } 
    // Extract contents of value based on format token 
    if (token == "yyyy" || token == "yy" || token == "y") { 
     if (token == "yyyy") { x = 4; y = 4; } 
     if (token == "yy") { x = 2; y = 2; } 
     if (token == "y") { x = 2; y = 4; } 
     year = _getInt(val, i_val, x, y); 
     if (year == null) { return 0; } 
     i_val += year.length; 
     if (year.length == 2) { 
      if (year > 70) { 
       year = 1900 + (year - 0); 
      } else { 
       year = 2000 + (year - 0); 
      } 
     } 
    } else if (token == "MMMM") { 
     month = 0; 
     for (var i = 0; i < MONTHS_LONG.length; i++) { 
      var month_name = MONTHS_LONG[i]; 
      if (val.substring(i_val, i_val + month_name.length) == month_name) { 
       month = i + 1; 
       i_val += month_name.length; 
       break; 
      } 
     } 
     if (month < 1 || month > 12) { return 0; } 
    } else if (token == "MMM") { 
     month = 0; 
     for (var i = 0; i < MONTHS_SHORT.length; i++) { 
      var month_name = MONTHS_SHORT[i]; 
      if (val.substring(i_val, i_val + month_name.length) == month_name) { 
       month = i + 1; 
       i_val += month_name.length; 
       break; 
      } 
     } 
     if (month < 1 || month > 12) { return 0; } 
    } else if (token == "MM" || token == "M") {  
     month = _getInt(val, i_val, token.length, 2); 
     if (month == null || month < 1 || month > 12) { return 0; } 
     i_val += month.length; 
    } else if (token == "dd" || token == "d") { 
     date = _getInt(val, i_val, token.length, 2); 
     if (date == null || date < 1 || date > 31) { return 0; } 
     i_val += date.length; 
    } else { 
     if (val.substring(i_val, i_val+token.length) != token) {return 0;} 
     else {i_val += token.length;} 
    } 
} 

// If there are any trailing characters left in the value, it doesn't match 
if (i_val != val.length) { return 0; } 

// Is date valid for month? 
if (month == 2) { 
    // Check for leap year 
    if ((year%4 == 0 && year%100 != 0) || (year%400 == 0)) { // leap year 
     if (date > 29) { return false; } 
    } else { 
     if (date > 28) { return false; } 
    } 
} 
if (month == 4 || month == 6 || month == 9 || month == 11) { 
    if (date > 30) { return false; } 
} 
return new Date(year, month - 1, date); 
} 
+0

धन्यवाद वल्ली। मैं नीचे गेटेट के जवाब के साथ गया, क्योंकि वह जिस समारोह से जुड़ा हुआ था वह छोटा था, और जिस दिन मैं नियमित रूप से उपयोग करता हूं, उसके साथ काम करता था। – pedalpete

15

डॉन ' टी उपयोग "नई तिथि()", क्योंकि यह स्थानीय समय के रूप में इनपुट दिनांक स्ट्रिंग लेता है:

new Date('11/08/2010').getTime()-new Date('11/07/2010').getTime(); //90000000 
new Date('11/07/2010').getTime()-new Date('11/06/2010').getTime(); //86400000 

हम का उपयोग करना चाहिए "NewDate() ", यह जीएमटी समय के रूप में इनपुट लेता है:

function NewDate(str) 
     {str=str.split('-'); 
      var date=new Date(); 
      date.setUTCFullYear(str[0], str[1]-1, str[2]); 
      date.setUTCHours(0, 0, 0, 0); 
      return date; 
     } 
NewDate('2010-11-07').toGMTString(); 
NewDate('2010-11-08').toGMTString(); 
1

यहाँ मेरी दृष्टिकोण है:

var parseDate = function(dateArg) { 
    var dateValues = dateArg.split('-'); 
    var date = new Date(dateValues[0],dateValues[1],dateValues[2]); 
    return date.format("m/d/Y"); 
} 

delimeter आप उपयोग कर रहे साथ ('-') बदलें।

2

यहां एक कोड स्निपेट है जो आईई (v ['date'] के व्यवहार को ठीक करता है, अल्पविराम से अलग दिनांक-स्ट्रिंग है, उदा।"2010,4,1"):

if($.browser.msie){ 
    $.lst = v['date'].split(','); 
    $.tmp = new Date(parseInt($.lst[0]),parseInt($.lst[1])-1,parseInt($.lst[2])); 
} else { 
    $.tmp = new Date(v['date']); 
} 

पिछले दृष्टिकोण पर विचार नहीं किया जाता है कि जे एस दिनांक महीने शून्य आधारित ...

क्षमा करें बहुत ज्यादा समझा नहीं करने के लिए, मैं काम पर हूँ और बस सोचा कि यह मदद कर सकता है।

81

एक mysql datetime/टाइमस्टैम्प प्रारूप से:

var dateStr="2011-08-03 09:15:11"; //returned from mysql timestamp/datetime field 
var a=dateStr.split(" "); 
var d=a[0].split("-"); 
var t=a[1].split(":"); 
var date = new Date(d[0],(d[1]-1),d[2],t[0],t[1],t[2]); 

मुझे आशा है कि किसी के लिए उपयोगी है। आईई एफएफ क्रोम

+1

अच्छा है! +1 –

+2

साझा करने के लिए धन्यवाद, बस मुझे जो चाहिए था। – Pascal

+1

इंटरनेट एक्सप्लोरर 8 – max4ever

7

में वर्क्स यहाँ एक और दृष्टिकोण है कि Date वस्तु के लिए एक विधि कहते है

उपयोग: var d = (new Date()).parseISO8601("1971-12-15");

 
    /** 
    * Parses the ISO 8601 formated date into a date object, ISO 8601 is YYYY-MM-DD 
    * 
    * @param {String} date the date as a string eg 1971-12-15 
    * @returns {Date} Date object representing the date of the supplied string 
    */ 
    Date.prototype.parseISO8601 = function(date){ 
     var matches = date.match(/^\s*(\d{4})-(\d{2})-(\d{2})\s*$/); 

     if(matches){ 
      this.setFullYear(parseInt(matches[1]));  
      this.setMonth(parseInt(matches[2]) - 1);  
      this.setDate(parseInt(matches[3]));  
     } 

     return this; 
    }; 
+0

http://stackoverflow.com/review/suggested-edits/3261141 – Stano

2

मैं हमेशा UTC समय में मेरी तारीख की दुकान।

यह मेरा स्वयं का कार्य है जो मुझे इस पृष्ठ में मिले विभिन्न कार्यों से बनाया गया है।

यह एक STRING को एक mysql डेटाटाइम प्रारूप के रूप में लेता है (उदाहरण: 2013-06-15 15:21:41)। रेगेक्स के साथ जांच वैकल्पिक है। आप प्रदर्शन को बेहतर बनाने के लिए इस भाग को हटा सकते हैं।

यह फ़ंक्शन एक टाइमस्टैम्प लौटाता है।

DATETIME को यूटीसी दिनांक के रूप में माना जाता है। सावधान रहें: यदि आप स्थानीय डेटाटाइम की अपेक्षा करते हैं, तो यह फ़ंक्शन आपके लिए नहीं है।

function datetimeToTimestamp(datetime) 
    { 
     var regDatetime = /^[0-9]{4}-(?:[0]?[0-9]{1}|10|11|12)-(?:[012]?[0-9]{1}|30|31)(?: (?:[01]?[0-9]{1}|20|21|22|23)(?::[0-5]?[0-9]{1})?(?::[0-5]?[0-9]{1})?)?$/; 
     if(regDatetime.test(datetime) === false) 
      throw("Wrong format for the param. `Y-m-d H:i:s` expected."); 

     var a=datetime.split(" "); 
     var d=a[0].split("-"); 
     var t=a[1].split(":"); 

     var date = new Date(); 
     date.setUTCFullYear(d[0],(d[1]-1),d[2]); 
     date.setUTCHours(t[0],t[1],t[2], 0); 

     return date.getTime(); 
    } 
0

आप ISO8601 तारीख स्ट्रिंग पार्स करने में निम्नलिखित कोड का उपयोग कर सकते हैं:

function parseISO8601(d) { 
    var timestamp = d; 
    if (typeof (d) !== 'number') { 
     timestamp = Date.parse(d); 
    } 
    return new Date(timestamp); 
}; 
0

datepicker की getDate सुविधा का उपयोग कर बाहर की कोशिश करो।

$.datepicker.formatDate('yy-mm-dd',new Date(pField.datepicker("getDate"))); 
+0

कृपया अपना उत्तर बताएं कि आप क्या समझाना चाहते हैं। –

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