web-dev-qa-db-fra.com

Le constructeur de date renvoie NaN dans IE, mais fonctionne dans Firefox et Chrome

J'essaie de construire un petit calendrier en JavaScript. Mes dates fonctionnent parfaitement dans Firefox et Chrome, mais dans IE, les fonctions de date renvoient NaN. 

Voici la fonction:

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 est le lundi de la semaine en cours qui est actuellement défini en php au format 'm, d, Y', par exemple "02, 01, 2010".

73
pedalpete

Le constructeur Date accepte n'importe quelle valeur. Si la primitive [[valeur]] de l'argument est numérique, la date créée a cette valeur. Si la primitive [[valeur]] est String, la spécification garantit uniquement que le constructeur Date et la méthode d'analyse sont capables d'analyser le résultat de Date.prototype.toString et Date.prototype.toUTCString ().

Un moyen fiable de définir une date consiste à en construire une et à utiliser les méthodes setFullYear et setTime.

Un exemple de cela apparaît ici: http://jibbering.com/faq/#parseDate

L’ECMA-262 r3 ne définit aucun format de date. Le passage de valeurs de chaîne au constructeur Date ou à Date.parse a un résultat dépendant de l'implémentation. Il vaut mieux éviter.


Edit: L'entrée de comp.lang.javascript FAQ est: Un format de date local ISO 8601 étendu YYYY-MM-DD peut être analysé en une Date comme suit: -

/**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;
  }
64
Garrett

A partir d'un format mysql datetime/timestamp:

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

J'espère que c'est utile pour quelqu'un . Fonctionne dans IE FF Chrome

84
Qlimax

N'utilisez pas "new Date ()", car il prend la chaîne de date d'entrée en heure locale:

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

nous devrions utiliser "NewDate ()", cela prend l'entrée comme heure GMT:

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

Voici une autre approche qui ajoute une méthode à l'objet Date

utilisation: var d = (new Date()).parseISO8601("1971-12-15");

 /**
 * Analyse la date formatée ISO 8601 dans un objet de date. ISO 8601 est AAAA-MM-JJ 
 * 
 * @param {String} date la date sous forme de chaîne, par exemple 1971-12-15 
 * @returns {Date} Objet Date représentant la date de la chaîne fournie 
 */
 Date.prototype.parseISO8601 = function (date) {
 var correspond = date.match (/ ^\s * (\ d {4}) - (\ d {2}) - (\ d {2})\s * $ /); 

 si (correspond à) {
 this.setFullYear (parseInt (correspond à [1])); 
 this.setMonth (parseInt (correspond à [2]) - 1); 
 this.setDate (parseInt (correspond à [3])); 
 } 

 retournez ceci; 
 }; 
7
magikMaker

Je stocke toujours ma date à l'heure UTC.

Ceci est ma propre fonction faite des différentes fonctions que j'ai trouvées dans cette page.

Il faut un STRING au format mysql DATETIME (exemple: 2013-06-15 15:21:41). La vérification avec la regex est facultative. Vous pouvez supprimer cette partie pour améliorer les performances.

Cette fonction renvoie un horodatage.

La DATETIME est considérée comme une date UTC . Attention: Si vous attendez une date/heure locale, cette fonction ne vous convient pas.

    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
Gabriel

Voici un extrait de code qui corrige le comportement d’IE (V ['date'] est une chaîne de date séparée par des virgules, par exemple «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']);
}

L’approche précédente ne considérait pas que JS Date month était basé sur ZERO ...

Désolé de ne pas avoir trop expliqué, je suis au travail et j'ai juste pensé que cela pourrait aider.

2
Martin Zeitler

Voici mon approche:

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

remplacez ('-') par le délimiteur que vous utilisez.

1
xin

Envoyez le texte de la date et le format dans lesquels vous envoyez le texte de la méthode ci-dessous. Il va analyser et retourner comme date et cela est indépendant du navigateur.

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);
}
1
valli

Vous pouvez utiliser le code suivant pour analyser la chaîne de date ISO8601:

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

Le constructeur Date en JavaScript nécessite une chaîne dans l’un des formats de date pris en charge par la méthode parse ().

Apparemment, le format que vous spécifiez n'est pas pris en charge dans IE. Vous devez donc modifier le code PHP ou analyser la chaîne manuellement en JavaScript.

0
richardtallent

Essayez d’utiliser la fonction getDate de datepicker.

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