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.
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");
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, "/")));
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
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();
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.
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
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);
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()
.
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
Comment pirater Date
avec fix-date? Pas de dépendances, min + gzip = 280 B
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.
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
Utiliser le format 'MM / JJ / AAAA'. Par exemple: - nouvelle Date ('28/02/2015'). Cela fonctionne bien dans tous les navigateurs.