web-dev-qa-db-fra.com

new Date () fonctionne dans Chrome mais pas Firefox

Je crée une chaîne de date/heure 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 son fonctionnement est parfait, quelle serait la cause principale?

83
pixeldev

Vous ne pouvez pas instancier un objet de date comme vous le souhaitez. Ce 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

De apsillers commentaire:

la spécification EMCAScript nécessite exactement un format de date (c'est-à-dire, 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 [ECMAScript-defined], la fonction peut revenir à une heuristique spécifique à l'implémentation ou à un format de date spécifique à l'implémentation. "Chrome et FF ont simplement des" formats de date spécifiques à chaque implémentation ".

76
Chris Laplante

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

21
Tahin Rahman

Cela fonctionne aussi dans la plupart des navigateurs

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

C'est le format de

"yyyy/MM/dd HH:mm:ss"
12
Alvis

Option 1 :

Supposons que votre timestring ait un format ressemblant à ceci:

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

Dans ce cas, vous pouvez faire une simple expression régulière pour le 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'

C'est le format de date/heure standard, et donc supporté 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 timestring ait un format ressemblant à 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 aussi produit 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 temporelle difficile à ajuster à l'une des normes bien supportées.

Dans ce cas, il est préférable de diviser votre chaîne temporelle en plusieurs 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
10
John Slegers

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 une heure en fonction du temps UTC. Cela signifie que si vous vivez dans le fuseau horaire GMT + 3 (3 heures à l’avance de l’heure GMT), le décalage de ce fuseau horaire sera ajouté à l’heure. avoir cette valeur, si GMT + 3 (notez qu'il s'agit de l'heure 20:00 et non de 17:00):

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

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

8
Gabrielius

J'avais un problème similaire dans Firefox et Safari lorsque je travaillais avec AngularJS. Par exemple, si une date renvoyée par Angular ressemble à 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'indique 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 traitait à la fois du problème de compatibilité entre navigateurs et du 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 plus facilement créer votre chaîne de date tout en évitant les problèmes de compatibilité de navigateur. En prime, vous aurez un bon moyen de formater facilement, d’ajouter, de soustraire, etc. si nécessaire.

5
SnapShot

Cela devrait fonctionner pour vous:

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

Je devais créer un formulaire en forme de date, 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));

Rappelez-vous que les mois en javascript vont de 0 à 11, vous devriez 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));
4
Bartek Kosa

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);
1
XORG_99

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

1
bjo

En fait, Chrome est plus flexible pour traiter différents formats de chaîne. Même si vous ne déterminez pas son format de chaîne, Chrome peut toujours convertir avec succès String. Date sans erreur, comme ceci:

  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à indiqué: ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse )

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 être toujours 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 2013-08-08 11:52:18 UTC en 2013-08-08T11: 52: 18Z d’abord, puis son format est adapté aux mots du document de Firefox. À ce stade, Date.parse aura toujours raison dans tous les navigateurs.

0
Haimei