Date non valide dans safari

 alert(new Date('2010-11-29'));

Chrome, ff n'a pas de problèmes avec cela, mais safari crie "Date invalide". Pourquoi?

Edit: ok, selon les commentaires ci-dessous, j'ai utilisé l'analyse de chaîne et essayé ceci:

alert(new Date('11-29-2010')); //doesn't work in safari
alert(new Date('29-11-2010')); //doesn't work in safari
alert(new Date('2010-29-11')); //doesn't work in safari

Edit Mar 22 2018 : on dirait que les gens atterrissent encore ici - Aujourd'hui, j'utiliserais moment ou date-fns et j'en ai fini avec. Date-fns est très bien sans douleur et léger ainsi.

93
demandé sur Shrinath 2010-11-30 08:58:18

13 réponses

Le modèle yyyy-MM-dd n'est pas un format officiellement pris en charge pour le constructeur Date. Firefox semble le supporter, mais ne comptez pas sur d'autres navigateurs faisant la même chose.

Voici quelques-unes des chaînes prises en charge, tirées de ce site :

  • mm-jj-aaaa
  • aaaa/MM/jj
  • jj/MM/aaaa
  • mmmm JJ, AAAA
  • mmm JJ, AAAA

DateJS semble être une bonne bibliothèque pour analyser les formats de date non standard.

Modifier : je viens de vérifier ECMA-262 standard . Citant l'article 15.9.1.15:

Date Heure Format De Chaîne

ECMAScript définit une chaîne format d'échange pour les dates-heures sur la base d'une simplification de L'ISO 8601 Format Étendu. Le format est comme suit: AAAA-MM-JJTHH: mm: SS.sssZ Où les champs sont les suivants:

  • YYYY est les chiffres décimaux de l'année dans le calendrier grégorien.
  • " - " (hyphon) apparaît littéralement deux fois dans le chaîne.
  • MM est le mois de l'Année du 01 (janvier) au 12 (décembre).
  • JJ est le jour du mois de 01 à 31.
  • "T" apparaît littéralement dans la chaîne, pour indiquer le début de l'élément de temps.
  • HH est le nombre d'heures complètes qui se sont écoulées depuis minuit comme deux chiffres après la virgule.
  • ":" (deux-points) apparaît littéralement deux fois dans la chaîne.
  • mm est le nombre de minutes complètes depuis le début heure deux chiffres après la virgule.
  • ss est le nombre de secondes depuis le début de la minute comme deux chiffres décimaux.
  • "."(point) apparaît littéralement dans la chaîne.
  • sss est le nombre de millisecondes complètes depuis le début de deuxième comme trois chiffres décimaux. Les deux le "."et le champ millisecondes peut être omis.
  • Z est le décalage de fuseau horaire spécifié comme " Z "(pour UTC) ou " + " ou "-" suivi d'une expression temporelle hh: mm

Ce format inclut les formulaires de date uniquement:

  • AAAA
  • AAAA-MM
  • AAAA-MM-JJ

Il comprend également des formulaires temporels avec un décalage de fuseau horaire facultatif ajouté:

  • THH: mm
  • THH: mm: ss
  • THH: mm: SS.sss

Sont également inclus "date-heures" qui peut être toute combinaison de ce qui précède.

Donc, il semble que YYYY-MM-DD est inclus dans la norme, mais pour une raison quelconque, Safari ne le supporte pas.

Update : après avoir regardé la documentation datejs , en l'utilisant, votre problème devrait être résolu en utilisant le code comme ceci:

var myDate1 = Date.parseExact("29-11-2010", "dd-MM-yyyy");
var myDate2 = Date.parseExact("11-29-2010", "MM-dd-yyyy");
var myDate3 = Date.parseExact("2010-11-29", "yyyy-MM-dd");
var myDate4 = Date.parseExact("2010-29-11", "yyyy-dd-MM");
120
répondu darioo 2018-01-19 16:21:30

Pour moi, implémenter une nouvelle bibliothèque juste parce que Safari ne peut pas le faire correctement est trop et une expression rationnelle est exagérée. Ici est le oneliner:

console.log (new Date('2011-04-12'.replace(/-/g, "/")));
151
répondu Elzo Valugi 2011-04-13 13:02:10

J'étais confronté à un problème similaire. Date.Parse ("DATESTRING") fonctionnait sur Chrome (Version 59.0.3071.115 ) mais pas sur Safari (Version 10.1.1 (11603.2.5))

Safari:

Date.parse("2017-01-22 11:57:00")
NaN

Chrome:

Date.parse("2017-01-22 11:57:00")
1485115020000

La solution qui a fonctionné pour moi a été de remplacer l'espace dans la chaîne de date par "T". ( exemple: dateString.remplacer (//g, "T"))

Safari:

Date.parse("2017-01-22T11:57:00")
1485086220000

Chrome:

Date.parse("2017-01-22T11:57:00")
1485115020000

Notez que la réponse du navigateur Safari est inférieure de 8 heures (28800000ms) à la réponse vu dans le navigateur Chrome parce que Safari a renvoyé la réponse dans TZ local (qui est 8hrs derrière UTC)

Pour obtenir les deux fois dans le même TZ

Safari:

Date.parse("2017-01-22T11:57:00Z")
1485086220000

Chrome:

Date.parse("2017-01-22T11:57:00Z")
1485086220000
11
répondu nizantz 2017-07-17 19:56:18

J'utilise moment pour résoudre le problème. Par exemple

var startDate = moment('2015-07-06 08:00', 'YYYY-MM-DD HH:mm').toDate();
8
répondu liwp_Stephen 2015-07-06 07:21:56

Pour qu'une solution fonctionne sur la plupart des navigateurs, vous devez créer votre objet date avec ce format

(year, month, date, hours, minutes, seconds, ms)

Par exemple:

dateObj = new Date(2014, 6, 25); //UTC time / Months are mapped from 0 to 11
alert(dateObj.getTime()); //gives back timestamp in ms

Fonctionne très bien avec IE, FF, Chrome et Safari. Même les versions plus anciennes.

Centre de développement IE: objet Date (JavaScript)

Mozilla Dev Réseau: Date

6
répondu Luxx 2016-08-03 07:18:17

Convertir la chaîne à Date fromat (vous devez connaître le fuseau horaire du serveur)

new Date('2015-06-16 11:00:00'.replace(/\s+/g, 'T').concat('.000+08:00')).getTime()  

Où + 08: 00 = Fuseau horaire du serveur

5
répondu miukki 2015-06-16 11:14:29

J'ai eu le même problème.Puis j'ai utilisé moment.Js .Problème a disparu.

Lors de la création d'un moment à partir d'une chaîne, nous vérifions d'abord si la chaîne correspond aux formats ISO 8601 connus, puis revenir à une nouvelle Date(chaîne) si un format connu est introuvable.

Avertissement: Le support du navigateur pour l'analyse des chaînes est incohérent. Parce il n'y a pas de spécification sur quels formats devraient être pris en charge, quoi dans certains navigateurs ne fonctionnent pas dans les autres navigateurs.

Pour des résultats cohérents, analyser autre chose que les chaînes ISO 8601, vous devez utiliser le format String+.

Par exemple

var date= moment(String);
4
répondu Sampath 2014-12-11 10:47:41

Bien que vous puissiez espérer que les navigateurs prennent en charge ISO 8601 (ou leurs sous-ensembles date uniquement), ce n'est pas le cas. Tous les navigateurs que je connais (au moins dans les paramètres régionaux américains/anglais que j'utilise) sont capables d'analyser l'horrible format US MM/DD/YYYY.

Si vous avez déjà les parties de la date, vous pouvez plutôt essayer d'utiliser Date.UTC () . Si vous ne le faites pas, mais que vous devez utiliser le format YYYY-MM-DD, je suggère d'utiliser une expression régulière pour analyser les morceaux que vous connaissez et ensuite les transmettre Date.UTC().

3
répondu Phrogz 2010-11-30 06:08:42

Utilisez le format ci-dessous, cela fonctionnerait sur tous les navigateurs

var year = 2016;
var month = 02;           // month varies from 0-11 (Jan-Dec)
var day = 23;

month = month<10?"0"+month:month;        // to ensure YYYY-MM-DD format
day = day<10?"0"+day:day;

dateObj = new Date(year+"-"+month+"-"+day);

alert(dateObj); 

/ / votre sortie ressemblerait à ceci " Wed Mar 23 2016 00: 00: 00 GMT+0530 (IST)"

/ / notez que ce serait dans le fuseau horaire actuel dans ce cas désigné par IST, pour convertir en fuseau horaire UTC, Vous pouvez inclure

alert(dateObj.toUTCSting);

/ / votre sortie aimerait maintenant ceci "Mar, 22 Mar 2016 18: 30: 00 GMT"

Notez que maintenant le dateObj affiche l'heure au format GMT, notez également que la date et l'heure ont été modifiées en conséquence.

La fonction "toUTCSting" récupère l'heure correspondante au méridien de Greenwich. Cela s'accomplit en établissant la différence de temps entre votre fuseau horaire actuel et le fuseau horaire du méridien de Greenwich.

Dans le cas ci-dessus, le temps avant la conversion était 00:00 heures et minutes le 23 mars de l'année 2016. Et après la conversion de GMT + 0530 (IST) heures à GMT (il soustrait essentiellement 5.30 heures de l'horodatage donné dans ce cas) l'heure reflète 18.30 heures sur le 22 mars dans l'année 2016 (exactement 5.30 heures derrière la première fois).

Pour convertir n'importe quel objet date en horodatage, vous pouvez utiliser

alert(dateObj.getTime());

/ / la sortie ressemblerait à ceci "1458671400000"

Cela vous donnerait l'horodatage unique de l'heure

1
répondu Abhay Aradhya 2016-02-10 05:47:22

Comment pirater Date avec fix-date? Pas de dépendances, min + gzip = 280 B

1
répondu Ken Berkeley 2017-07-14 06:00:23

La meilleure façon de le faire est d'utiliser le format suivant:

new Date(year, month, day, hours, minutes, seconds, milliseconds)
var d = new Date(2018, 11, 24, 10, 33, 30, 0);

Ceci est pris en charge dans tous les navigateurs et ne vous posera aucun problème. Veuillez noter que les mois sont écrits de 0 à 11.

1
répondu Daniël Brito 2018-06-01 08:04:11

Le même problème rencontré dans Safari et il a été résolu en insérant ceci dans la page web

 <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script> 

J'espère que cela fonctionnera aussi dans votre cas

Merci

0
répondu Yasir Shabbir Choudhary 2018-02-08 12:07:43

Utiliser le format 'MM / JJ / AAAA'. Par exemple: - nouvelle Date ('28/02/2015'). Cela fonctionne bien dans tous les navigateurs.

-1
répondu Ravi S 2015-02-25 19:39:05