79 votes

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 très bien 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 en fait défini dans php au format 'm, d, Y', par ex. "02, 01, 2010" .

2 votes

Vous avez des erreurs de copier-coller dans votre exemple de code, regardez l'instruction for : for(var d=0;d'; qui soulèvera un SyntaxError ...

0 votes

87voto

Qlimax Points 1965

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 qu'il sera utile à quelqu'un. Fonctionne dans IE FF Chrome

0 votes

Fonctionne avec tous les navigateurs. Thnx

1 votes

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]); pour ES5 ou mieux.

67voto

Garrett Points 1534

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

Une manière fiable de définir une date est d'en construire une et d'utiliser la fonction setFullYear y setTime méthodes.

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 de date ou à Date.parse a des résultats qui dépendent de l'implémentation. Il est préférable de l'é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 un Date avec ce qui 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;
  }

0 votes

Merci Garrett. La fonction que vous avez fournie dans le lien est la meilleure, bien plus concise que tout ce que j'ai pu trouver, et elle fonctionne avec le format de date que j'utilise dans les 99 % restants de l'application ! Beaucoup plus cohérent que ce que j'utilisais.

0 votes

Ce n'est, hélas, pas une bonne chose, car de nombreux formats structurés utilisent simplement les formats de date et d'heure du W3C (ISO-8601 avec les spécifications complètes, etc.). Ainsi, bien que les timestamps soient meilleurs à bien des égards (plus simples, plus efficaces, fonctionnant avec tous les navigateurs), il est souvent nécessaire que les données date/heure standard soient analysées par javascript. Je me demande si jQuery ou autre n'aurait pas de meilleures méthodes d'analyse.

3 votes

Merci d'avoir signalé ce problème. Je me demande pourquoi chrome fonctionne bien pour analyser les dates alors qu'ie7 dit NAN, heureusement que $.datepicker.parseDate de jquery est capable d'analyser les dates.

15voto

diyism Points 1191

N'utilisez pas "new Date()", car il prend la chaîne de date entrée comme 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()", qui 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();

7voto

magikMaker Points 434

Voici une autre approche qui consiste à ajouter une méthode à la fonction Date objet

l'usage : 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;
    };

1voto

valli Points 1789

Envoyez le texte de la date et le format dans lequel vous envoyez le texte de la date dans la méthode ci-dessous. Le texte sera analysé et renvoyé sous forme de date, indépendamment 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);
}

0 votes

Merci Valli. J'ai choisi la réponse de Garrett ci-dessous, car la fonction dont il a donné le lien était plus petite et fonctionnait avec le format de date que j'utilise régulièrement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X