2 votes

Existe-t-il un format de chaîne de caractères pour la date qui fonctionne dans tous les navigateurs et dans toutes les localités ?

Existe-t-il un format de chaîne de caractères d'une date à partir duquel un objet Date peut être construit (c'est-à-dire new Date('date string') ) qui fonctionne dans tous les navigateurs et dans toutes les localités et tous les fuseaux horaires ?

Nous avons essayé d'utiliser le format suggéré dans la spécification HTML5 de yyyy-mm-ddThh:mm:ss+hh:mm mais a rencontré des problèmes avec Safari et IE. Nous avons essayé d'utiliser le format moins formel de mm/dd/yyyy hh:ss:mm qui fonctionne mais, pour autant que je sache, le formatage "mois avant jour" peut être ambigu si vos paramètres locaux supposent que le premier chiffre est un jour (pays non américains). De plus, il n'attache pas de fuseau horaire, ce qui poserait des problèmes avec des fuseaux horaires différents.

3voto

ckozl Points 4838

En bref, il est pratiquement impossible de faire cette promesse, car la mise en œuvre dépend de l'Union européenne. Je recommanderais d'utiliser le format iso8601 qui sera le standard à l'avenir et d'utiliser un shim pour aider à l'analyse de la date - en voici un que j'ai écrit pour mon propre usage :

(function() {

var d = window.Date,
    regexIso8601 = /^(\d{4}|\+\d{6})(?:-(\d{2})(?:-(\d{2})(?:T(\d{2}):(\d{2}):(\d{2})\.(\d{1,3})(?:Z|([\-+])(\d{2}):(\d{2}))?)?)?)?$/;

if (d.parse('2011-11-29T15:52:30.5') !== 1322581950500 ||
    d.parse('2011-11-29T15:52:30.52') !== 1322581950520 ||
    d.parse('2011-11-29T15:52:18.867') !== 1322581938867 ||
    d.parse('2011-11-29T15:52:18.867Z') !== 1322581938867 ||
    d.parse('2011-11-29T15:52:18.867-03:30') !== 1322594538867 ||
    d.parse('2011-11-29') !== 1322524800000 ||
    d.parse('2011-11') !== 1320105600000 ||
    d.parse('2011') !== 1293840000000) {

    d.__parse = d.parse;

    d.parse = function(v) {

        var m = regexIso8601.exec(v);

        if (m) {
            return Date.UTC(
                m[1],
                (m[2] || 1) - 1,
                m[3] || 1,
                m[4] - (m[8] ? m[8] + m[9] : 0) || 0,
                m[5] - (m[8] ? m[8] + m[10] : 0) || 0,
                m[6] || 0,
                ((m[7] || 0) + '00').substr(0, 3)
            );
        }

        return d.__parse.apply(this, arguments);

    };
}

d.__fromString = d.fromString;

d.fromString = function(v) {

    if (!d.__fromString || regexIso8601.test(v)) {
        return new d(d.parse(v));
    }

    return d.__fromString.apply(this, arguments);
};

})();

Au lieu de cela, utilisez Date.fromString(....) et tout le monde sera heureux au pays d'OZ !

fonctionne dans tous les principaux navigateurs, a utilisé ces références :

http://dev.w3.org/html5/spec/common-microsyntaxes.html

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

http://msdn.microsoft.com/en-us/library/Windows/apps/ff743760(v=vs.94).aspx

http://msdn.microsoft.com/en-us/library/Windows/apps/wz6stk2z(v=vs.94).aspx

http://msdn.microsoft.com/en-us/library/Windows/apps/k4w173wk(v=vs.94).aspx

https://connect.microsoft.com/IE/feedback/details/723740/date-parse-and-new-date-fail-on-valid-formats

J'espère que cela vous aidera -ck

MISE À JOUR : (1/21/2013)

Il convient de noter que le comportement considéré comme "conforme aux normes" va changer entre ECMAScript-262 v5.1 et ECMAScript-262 v6.0. Voir : http://people.mozilla.org/~jorendorff/es6-draft.html#sec-15.9.1.15

La langue est passée de : La valeur d'un décalage de fuseau horaire absent est "Z". à Si le décalage de fuseau horaire est absent, la date-heure est interprétée comme une heure locale.

Le problème actuel est que chrome, opera et safari mobile suivent ES5.1, alors qu'IE10, firefox et safari de bureau semblent suivre ES6. Il s'agit donc d'une décision partagée... Il faut donc une deuxième version de ce script conforme à la norme ES6, et la voici :

(function() {

    var d = window.Date,
        regexIso8601 = /^(\d{4}|\+\d{6})(?:-(\d{2})(?:-(\d{2})(?:T(\d{2}):(\d{2}):(\d{2})\.(\d{1,})(Z|([\-+])(\d{2}):(\d{2}))?)?)?)?$/,
        lOff, lHrs, lMin;

    if (d.parse('2011-11-29T15:52:30.5') !== 1322599950500 ||
        d.parse('2011-11-29T15:52:30.52') !== 1322599950520 ||
        d.parse('2011-11-29T15:52:18.867') !== 1322599938867 ||
        d.parse('2011-11-29T15:52:18.867Z') !== 1322581938867 ||
        d.parse('2011-11-29T15:52:18.867-03:30') !== 1322594538867 ||
        d.parse('2011-11-29') !== 1322524800000 ||
        d.parse('2011-11') !== 1320105600000 ||
        d.parse('2011') !== 1293840000000) {

        d.__parse = d.parse;

        lOff = -(new Date().getTimezoneOffset());
        lHrs = Math.floor(lOff / 60);
        lMin = lOff % 60;

        d.parse = function(v) {

            var m = regexIso8601.exec(v);

            if (m) {
                return Date.UTC(
                    m[1],
                    (m[2] || 1) - 1,
                    m[3] || 1,
                    m[4] - (m[8] ? m[9] ? m[9] + m[10] : 0 : lHrs) || 0,
                    m[5] - (m[8] ? m[9] ? m[9] + m[11] : 0 : lMin) || 0,
                    m[6] || 0,
                    ((m[7] || 0) + '00').substr(0, 3)
                );
            }

            return d.__parse.apply(this, arguments);

        };
    }

    d.__fromString = d.fromString;

    d.fromString = function(v) {

        if (!d.__fromString || regexIso8601.test(v)) {
            return new d(d.parse(v));
        }

        return d.__fromString.apply(this, arguments);
    };

})();

1voto

KooiInc Points 38845

Afaik ' yyyy-mm-dd hh:mm:ss est un format à partir duquel vous pouvez construire une date dans chaque fuseau horaire (à l'aide de new Date(''yyyy-mm-dd hh:mm:ss') ).

par exemple (aux Pays-Bas)

new Date('1933-03-17 12:33:03'); 
   //=> Fri Mar 17 1933 12:33:03 GMT+0100 (West-Europa (standaardtijd))
new Date('1933-03-17 12:33:03').toUTCString()
   //=> Fri, 17 Mar 1933 11:33:03 GMT

0voto

Glen J Fergo Points 134

0voto

Kit Barnes Points 635

Je ne sais pas s'il existe un format de chaîne, mais en utilisant new Date(2012,1,20,15,10,0) devrait fonctionner. C'est-à-dire, Date(Years, Months, Days, Hours, Mins, Seconds) , avec month être 0 indexé.

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