दिनांक निर्माता IE में NaN देता है, लेकिन फ़ायरफ़ॉक्स और क्रोम में काम करता है


79

मैं जावास्क्रिप्ट में एक छोटा कैलेंडर बनाने की कोशिश कर रहा हूं। मेरे पास फ़ायरफ़ॉक्स और क्रोम में काम करने की मेरी तारीखें हैं, लेकिन IE में डेट फ़ंक्शंस 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
आपके पास अपने कोड नमूने पर कुछ कॉपी-पेस्ट त्रुटियां हैं, बयान के लिए देखें: for(var d=0;d';जो कि एक SyntaxError...
क्रिश्चियन सी। साल्वाडोर

क्या इससे आपके सवाल का जवाब मिलता है? Date.parse गलत परिणाम क्यों देता है?
हेरेनेटिक मंकी

जवाबों:


67

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

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

इसका एक उदाहरण यहाँ दिखाई देता है: http://jibbering.com/faq/#parseDate

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


संपादित करें: comp.lang.javascript FAQ से प्रविष्टि है: एक विस्तारित ISO 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;
  }

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

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

3
इशारा करने के लिए धन्यवाद, पागल हो रहा है कि क्रोम ठीक पार्स करने की तारीखों पर काम क्यों करता है, जबकि आई 7, नान कह रहा है, अच्छी बात $ .datepicker.parseDate jquery से तारीखों को पार्स करने में सक्षम है
कार्लोस Jaime C. De Leon

क्या होगा यदि आप चाहते हैं कि मिलिसेकंड भी हो?
ओकीसैबनी

मैं एक फ़ंक्शन का उपयोग कर रहा हूं जो एक स्ट्रिंग से आईएसओ दिनांक / समय पार्स करने के लिए इस कोड से प्राप्त किया गया था। दुर्लभ अवसरों पर, मेरे पास एक मान्य मान्य if (month != date.getMonth() + 1)विवरण होगा, जिसमें तिथि को अमान्य किया जाएगा। उदाहरण के लिए, 2014-06-01T01:09:22.68। क्या आप इस ifकथन का उद्देश्य बता सकते हैं ?
ग्रिन

87

Mysql डेटाइम / टाइमस्टैम्प प्रारूप से:

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]);

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


सभी ब्राउज़रों के साथ काम करता है। थंक्स
तेजस

1
const a = dateStr.split(' '); const d = a[0].split('-'); const t = a[1].split(':'); currentValue.created_date = new Date(+d[0], (+d[1] - 1), +d[2], +t[0], +t[1]);ES5 या बेहतर के लिए।
सेडवेल

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

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

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();

7

यहां एक और दृष्टिकोण है जो Dateऑब्जेक्ट में एक विधि जोड़ता है

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

    / **
     * आईएसओ 8601 को दिनांकित वस्तु के रूप में तैयार किया गया, आईएसओ 8601 YYYY-MM-DD है
     * 
     * @ अपर {स्ट्रिंग} १ ९ .१-१२-१५ जैसे एक तार के रूप में तारीख
     * @returns {दिनांक} आपूर्ति किए गए स्ट्रिंग की तारीख का प्रतिनिधित्व करने वाला दिनांक ऑब्जेक्ट
     * /
    Date.prototype.parseISO8601 = फ़ंक्शन (दिनांक) {
        var मैच = date.match (/ ^ \ s * (\ d {4}) - (\ d {2}) - (\ d {2}) \ s * $ /);

        अगर (मैच) {
            it.setFullYear (parseInt ([1])));    
            this.setMonth (parseInt (मैचों [2]) - 1);    
            it.setDate (parseInt ([3])));    
        }

        इसे वापस करो;
    };

2

मैं हमेशा UTC के समय में अपनी तिथि संग्रहीत करता हूं।

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

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

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

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

    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();
    }

2

यहाँ एक कोड स्निपेट है जो IE के व्यवहार को ठीक करता है (v ['तारीख'] एक अल्पविराम से अलग दिनांक-स्ट्रिंग है, जैसे "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']);
}

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

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


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");
}

('-')आपके द्वारा उपयोग किए जा रहे परिधि के साथ बदलें ।


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

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

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


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

0

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

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


0

मैंने उपरोक्त सभी समाधानों की कोशिश की लेकिन मेरे लिए कुछ भी काम नहीं किया। मैंने कुछ मंथन किया और यह पाया और IE11 में भी ठीक काम किया।

value="2020-08-10 05:22:44.0";
var date=new Date(value.replace(" ","T")).$format("d/m/yy h:i:s");
console.log(date);

यदि $ स्वरूप केवल आपके लिए प्रारूप का उपयोग करने के लिए काम नहीं कर रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.