la nouvelle date () fonctionne dans Chrome mais pas dans Firefox

89

Je crée une chaîne datetime qui ressemble à ceci: 2010-07-15 11:54:21

Et avec le code suivant, j'obtiens une date invalide dans Firefox mais fonctionne très bien dans Chrome

var todayDateTime = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds;
var date1 = new Date(todayDateTime);

Dans Firefox, date1 me donne une date invalide, mais dans Chrome, cela fonctionne très bien, quelle en serait la cause principale?

pixeldev
la source
2
si vous voulez jouer avec comme vous le souhaitez, rendez-vous avec datejs.com
Sinan
Toutes les implémentations ne prennent pas en charge le format dans ECMA-262, alors analysez toujours manuellement les chaînes (une bibliothèque peut aider mais n'est probablement pas nécessaire pour les formats uniques).
RobG
Cela fonctionne maintenant Firefox.
Sm Yamashita

Réponses:

78

Vous ne pouvez pas instancier un objet date comme vous le souhaitez. Cela doit être d'une manière spécifique. Voici quelques exemples valables:

new Date() // current date and time
new Date(milliseconds) //milliseconds since 1970/01/01
new Date(dateString)
new Date(year, month, day, hours, minutes, seconds, milliseconds)

ou

d1 = new Date("October 13, 1975 11:13:00")
d2 = new Date(79,5,24)
d3 = new Date(79,5,24,11,33,0)

Chrome doit simplement être plus flexible.

Source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

Du commentaire d' Apsillers :

la spécification EMCAScript requiert exactement un format de date (par exemple, AAAA-MM-JJTHH: mm: ss.sssZ) mais les formats de date personnalisés peuvent être librement pris en charge par une implémentation : " Si la chaîne n'est pas conforme à ce format [défini par ECMAScript] la fonction peut revenir à n'importe quelle heuristique spécifique à l'implémentation ou à des formats de date spécifiques à l'implémentation. "Chrome et FF ont simplement différents" formats de date spécifiques à l'implémentation ".

Chris Laplante
la source
3
J'ai une solution qui fonctionne dans tous les navigateurs, y compris Firefox: stackoverflow.com/a/21984717/586051
Rahul Desai
7
Quant à savoir pourquoi cette différence de navigateur existe: la spécification EMCAScript nécessite exactement un format de date (c'est-à-dire YYYY-MM-DDTHH:mm:ss.sssZ) mais les formats de date personnalisés peuvent être librement pris en charge par une implémentation : " Si la chaîne n'est pas conforme à ce format [défini par ECMAScript], la fonction peut revenir à des heuristiques spécifiques à la mise en œuvre ou à des formats de date spécifiques à la mise en œuvre. "Chrome et FF ont simplement différents" formats de date spécifiques à la mise en œuvre ".
apsillers
Un exemple de format de date (mois qui comprend un ".") Qui fonctionne dans Chrome mais pas dans Firefox: 'Feb. 14 octobre 2019 '
codescribblr
23

Cela fonctionne dans tous les navigateurs -

nouvelle Date ('2001/01/31 12:00:00 AM')

new Date('2001-01-31 12:00:00')

Format: AAAA-MM-JJTHH: mm: ss.sss

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

Tahin Rahman
la source
parce que nous savons tous que c'est une norme internationale. w3.org/International/questions/qa-date-format
Bobby Tables
6
Vous avez donc testé tous les navigateurs ? Et en supposant que c'est le cas, vous savez également que tous les navigateurs à l'avenir prendront également en charge ce format (non standard)?
RobG
1
Cela fonctionne pour moi. Donc, si vous obtenez déjà une chaîne de '2001-1-31 12:00:00', nous pouvons simplement faire: new Date (str.replace (/ - / g, '/'));
Jianwu Chen
@JianwuChen Vous modifiez délibérément un format standard en non standard. Pas une bonne idée.
JJJ
2
Après 3 ans plus tard, il ne fonctionne pas sur Edge et Window Safari.
Mg Thar
13

Option 1 :

Supposons que votre chaîne temporelle ait un format qui ressemble à ceci:

'2016-03-10 16:00:00.0'

Dans ce cas, vous pouvez faire une simple regex pour la convertir en ISO 8601:

'2016-03-10 16:00:00.0'.replace(/ /g,'T')

Cela produirait la sortie suivante:

'2016-03-10T16:00:00.0'

Il s'agit du format datetime standard, et donc pris en charge par tous les navigateurs:

document.body.innerHTML = new Date('2016-03-10T16:00:00.0') // THIS IS SAFE TO USE

Option 2 :

Supposons que votre chaîne temporelle ait un format qui ressemble à ceci:

'02-24-2015 09:22:21 PM'

Ici, vous pouvez faire la regex suivante:

'02-24-2015 09:22:21 PM'.replace(/-/g,'/');

Cela produit également un format pris en charge par tous les navigateurs:

document.body.innerHTML = new Date('02/24/2015 09:22:21 PM') // THIS IS SAFE TO USE

Option 3:

Supposons que vous ayez une chaîne de temps qui ne soit pas facile à ajuster à l'une des normes bien prises en charge.

Dans ce cas, il est préférable de simplement diviser votre chaîne de temps en différentes parties et de les utiliser comme paramètres individuels pour Date:

document.body.innerHTML = new Date(2016, 2, 26, 3, 24, 0); // THIS IS SAFE TO USE

John Slegers
la source
1
var d = new Date ('2017-08-28 08:02 PM'.replace (/ - / g,' / ')); Cela fonctionne parfaitement pour moi dans Chrome aussi bien dans Mozilla.
Rahul Mankar
13

Cela fonctionne également dans la plupart des navigateurs

new Date('2001/01/31 12:00:00')

C'est le format de

"yyyy/MM/dd HH:mm:ss"
Alvis
la source
3
Il n'y a aucune garantie que le format fonctionnera dans n'importe quel navigateur, encore moins "tous".
RobG
Vous avez raison à ce sujet, la réponse est basée sur mon expérience.
Alvis
8

Si vous souhaitez toujours créer une date à l'aide de tirets, vous pouvez utiliser ce format:

var date = new Date('2013-08-31T17:00:00Z')

Mais gardez à l'esprit que cela crée du temps en fonction de l'UTC. Cela signifie que si vous vivez dans le fuseau horaire GMT + 3 (3 heures avant GMT), cela ajoutera ce décalage de fuseau horaire à l'heure. Ainsi, l'exemple ci-dessus aura cette valeur, si GMT + 3 (notez qu'il est l'heure 20h00 et non 17h00):

Sat Aug 31 2013 20:00:00 GMT+0300 (FLE Standard Time)

Assurez-vous d'ajouter la lettre «Z» à la fin, car sinon Chrome et Firefox analyseront la chaîne différemment (l'un ajoutera un décalage horaire et l'autre non).

Gabrielius
la source
1
Oui, Chrome et Firefox se comportent différemment si vous ne fournissez pas de fuseau horaire. Et, par intérêt, je pense que Firefox le fait mal. Il devrait supposer GMT si le fuseau horaire est absent. Chrome le fait, Firefox non. ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
Julian Jelfs
@ JulianJelfs— " Il devrait supposer GMT si le fuseau horaire est absent ", uniquement pour la date (contrairement à ISO 8601). Pour les chaînes de date et d'heure, il doit supposer local (conformément à ISO 8601). Mais dans tous les cas, l'analyse manuelle est la seule solution sûre.
RobG
5

J'avais un problème similaire dans Firefox et Safari lorsque je travaillais avec AngularJS. Par exemple, si une date renvoyée par Angular ressemblait à ceci:

2014-06-02 10:28:00

en utilisant ce code:

new Date('2014-06-02 10:28:00').toISOString();

renvoie une erreur de date non valide dans Firefox et Safari. Cependant, dans Chrome, cela fonctionne bien. Comme l'a indiqué une autre réponse, Chrome est probablement plus flexible avec l'analyse des chaînes de date.

Mon objectif final était de formater la date d'une certaine manière. J'ai trouvé une excellente bibliothèque qui gère à la fois le problème de compatibilité entre navigateurs et le problème de formatage de la date. La bibliothèque s'appelle moment.js .

En utilisant cette bibliothèque, le code suivant fonctionne correctement sur tous les navigateurs que j'ai testés:

moment('2014-06-02 10:28:00').format('MMM d YY')

Si vous souhaitez inclure cette bibliothèque supplémentaire dans votre application, vous pouvez créer plus facilement votre chaîne de date tout en évitant d'éventuels problèmes de compatibilité du navigateur. En prime, vous aurez un bon moyen de formater, ajouter, soustraire, etc. des dates si nécessaire.

Instantané
la source
Vous devez toujours transmettre le format à moment.js lors de l'analyse des chaînes, sinon il devine jusqu'à ce qu'il en trouve une qui crée une date valide.
RobG
4

Cela devrait fonctionner pour vous:

var date1 = new Date(year, month, day, hour, minute, seconds);

J'ai dû créer une date sous forme de chaîne, donc je l'ai fait comme ceci:

var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2), d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));

N'oubliez pas que les mois en javascript vont de 0 à 11, vous devez donc réduire la valeur du mois de 1, comme ceci:

var d = '2013-07-20 16:57:27';
var date1 = new Date(d.substr(0, 4), d.substr(5, 2) - 1, d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));
Bartek Kosa
la source
2

Solution simple, cela fonctionne avec tous les navigateurs,

var StringDate = "24-11-2017"   
var DateVar = StringDate.split("-");
var DateVal = new Date(DateVar[1] + "/" + DateVar[0] + "/" + DateVar[2]);
alert(DateVal);
XORG_99
la source
1

Une situation que j'ai rencontrée concernait les millisecondes. FF et IE n'analyseront pas correctement cette chaîne de date lors de la tentative de création d'une nouvelle date. "2014/11/24 17:38:20.177Z" Ils ne savent pas comment gérer .177Z. Chrome fonctionnera cependant.

bjo
la source
0

En fait, Chrome est plus flexible pour gérer différents formats de chaîne. Même si vous ne comprenez pas son format de chaîne, Chrome peut toujours convertir avec succès String en date sans erreur. Comme ça:

  var outputDate = new Date(Date.parse(inputString));

Mais pour Firefox et Safari, les choses deviennent plus complexes. En fait, dans le document de Firefox, il est déjà dit: ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse )

Une chaîne représentant une date RFC2822 ou ISO 8601 (d'autres formats peuvent être utilisés, mais les résultats peuvent être inattendus).

Donc, lorsque vous souhaitez utiliser Date.parse dans Firefox et Safari, vous devez être prudent. Pour moi, j'utilise une méthode astucieuse pour y faire face. (Remarque: cela peut ne pas toujours être correct dans tous les cas)

if (input.indexOf("UTC") != -1) {
  var tempInput = inputString.substr(0, 10) + "T" + inputString.substr(11, 8) + "Z";
  date = new Date(Date.parse(tempInput));
}

Ici, il convertit d'abord 2013-08-08 11:52:18 UTC en 2013-08-08T11: 52: 18Z , puis son format est des mots adaptés dans le document de Firefox. À ce moment, Date.parse sera toujours correct dans n'importe quel navigateur.

Haimei
la source
0

C'est ce qui a fonctionné pour moi Firefoxet Chrome:

// The format is 'year-month-date hr:mins:seconds.milliseconds'
const d = new Date('2020-1-4 12:00:00.999') 
// we use the `.` separator between seconds and milliseconds.

Bonne chance...

Aakash
la source
-1

Dans Firefox, toute Date invalide est renvoyée en tant qu'objet Date en tant que Date 1899-11-29T19:00:00.000Z, vérifiez donc si le navigateur est Firefox puis récupérez l'objet Date de la chaîne "1899-11-29T19:00:00.000Z".getDate(). Enfin comparez-le avec la date.

Shahrukh Azeem
la source
Cela n'explique pas la cause du problème, mais plutôt le résultat du problème.
Rytis
-1

J'ai utilisé le format de date suivant et cela fonctionne dans tous les navigateurs.

var target_date = new Date("Jul 17, 2015 16:55:22").getTime();

var days, hours, minutes, seconds;

var countdown = document.getElementById("countdown");

remaining = setInterval(function () {

    var current_date = new Date().getTime();
    var seconds_left = (target_date - current_date) / 1000;
    days = parseInt(seconds_left / 86400);
    seconds_left = seconds_left % 86400;
    hours = parseInt(seconds_left / 3600);
    seconds_left = seconds_left % 3600;
    minutes = parseInt(seconds_left / 60);
    seconds = parseInt(seconds_left % 60);
    countdown.innerHTML = "<b>"+days + " day, " + hours + " hour, "
        + minutes + " minute, " + seconds + " second.</b>";  
}, 1000);
umesh
la source