alert(new Date('2010-11-29'));
chrome, ff n'a pas de problème avec ça, mais safari crie "date invalide". Pourquoi ?
edit: ok, selon les commentaires ci-dessous, j'ai utilisé l'analyse syntaxique 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
éditer 22 mars 2018: On dirait que les gens sont encore en train d'atterrir ici - Aujourd'hui, j'utiliserais moment
ou date-fns
et en finir avec ça. Date-fns est très léger et sans douleur.
Le motif 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 les autres navigateurs.
Voici quelques chaînes supportées, extraites de ce site :
DateJS semble être une bonne bibliothèque pour analyser des formats de date non standard.
Edit : viens de cocher norme ECMA-262 . Citant la section 15.9.1.15:
Format Date Chaîne Heure
ECMAScript définit un format d'échange de chaîne pour les dates avec une simplification du format étendu ISO 8601. Le format est le suivant: AAAA-MM-JJTHH: mm: ss.sssZ Où les champs sont les suivants:
- AAAA correspond aux chiffres décimaux de l'année du calendrier grégorien.
- "-" (trait d'union) apparaît littéralement deux fois dans la chaîne.
- MM est le mois de l'année du 01 (janvier) au 12 (décembre).
- DD est le jour du mois du 01 au 31.
- "T" apparaît littéralement dans la chaîne, pour indiquer le début de l'élément time.
- HH est le nombre d'heures complètes écoulées depuis minuit sous forme de deux chiffres décimaux.
- ":" (deux points) apparaît littéralement deux fois dans la chaîne.
- mm est le nombre de minutes complètes écoulées depuis le début de l'heure sous forme de deux chiffres décimaux.
- ss est le nombre de secondes complètes écoulées depuis le début de la minute sous forme de 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 la seconde sous forme de trois chiffres décimaux. Les deux "." et le champ millisecondes peut être omis.
- Z est le décalage de fuseau horaire spécifié sous la forme "Z" (pour UTC) ou "+" ou "-" suivi d'une expression temporelle hh: mm
Ce format inclut les formulaires à date uniquement:
- AAAA
- AAAA-MM
- AAAA-MM-JJ
Il inclut également des formulaires horaires uniquement avec un décalage de fuseau horaire facultatif ajouté:
- THH: mm
- THH: mm: ss
- THH: mm: ss.sss
Sont également inclus les "dates-heures" qui peuvent être toute combinaison de ce qui précède.
Donc, il semble que AAAA-MM-JJ soit incluse dans la norme, mais pour une raison quelconque, Safari ne la prend pas en charge.
Mise à jour : après avoir regardé datejs documentation , en l'utilisant, votre problème devrait être résolu en utilisant un code comme celui-ci:
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 simplement parce que Safari ne peut pas le faire correctement, c’est trop et une expression régulière est exagérée. Voici le oneliner:
console.log (new Date('2011-04-12'.replace(/-/g, "/")));
Je faisais face à un problème similaire. Date.Parse("DATESTRING")
travaillait sur Chrome (version 59.0.3071.115) mais pas de 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 de la chaîne chaîne de date par "T"
. (exemple: dateString.replace(/ /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 (28 800 000 ms) à la réponse affichée dans Chrome car Safari a renvoyé la réponse dans la zone TZ locale (8 heures après l'UTC)).
Pour obtenir les deux temps 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 le 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 de 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 bien avec IE, FF, Chrome et Safari. Même les versions les plus anciennes.
convertir une chaîne au format Date (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 . Le 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 nous retournons à la nouvelle Date (chaîne) si un format connu n'est pas trouvé.
Avertissement: la prise en charge du navigateur pour l'analyse des chaînes est incohérente. Comme il n’existe aucune spécification sur les formats à prendre en charge, ce qui fonctionne dans certains navigateurs ne fonctionnera pas dans d’autres.
Pour obtenir des résultats cohérents lors de l'analyse d'éléments autres que les chaînes ISO 8601, vous devez utiliser String + Format.
par exemple
var date= moment(String);
Bien que vous puissiez espérer que les navigateurs prennent en charge ISO 8601 (ou des sous-ensembles de date uniquement), ce n'est pas le cas. Tous les navigateurs que je connais (du moins dans les environnements linguistiques américains/anglais que j'utilise) peuvent analyser le format horrible US MM/DD/YYYY
.
Si vous avez déjà les parties de la date, vous voudrez peut-être 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 de les transmettre ensuite à Date.UTC()
.
Que diriez-vous de Hijack Date
avec fix-date ? Aucune dépendance, min + gzip = 280 B
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 "mer 23 mars 2016 00:00:00 GMT + 0530 (IST)"
// Notez que ceci serait dans le fuseau horaire actuel dans ce cas, noté IST, pour convertir en fuseau horaire UTC vous pouvez inclure
alert(dateObj.toUTCSting);
// Votre sortie aimerait maintenant ceci "Mardi, 22 mars 2016 18:30:00 GMT"
Notez que maintenant 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. Pour ce faire, il établit la différence de temps entre votre fuseau horaire actuel et le fuseau horaire de Greenwich Meridian.
Dans le cas ci-dessus, l'heure précédant la conversion était 00:00 heures et minutes le 23 mars 2016. Et après la conversion de l'heure GMT + 0530 (IST) en heure GMT (elle soustrait fondamentalement 5,30 heures de l'horodatage donné de cette heure). cas), l’heure indique 18h30 le 22 mars 2016 (exactement 5,30 heures de retard par rapport à la première fois).
En outre, pour convertir tout objet de date en horodatage, vous pouvez utiliser
alert(dateObj.getTime());
// la sortie ressemblerait à ceci "1458671400000"
Cela vous donnerait l'horodatage unique de l'heure
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 supporté par 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 dans Safari et il a été résolu en l'insérant 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 votre cas aussi
Merci
Comme @nizantz l'a déjà mentionné, l'utilisation de Date.parse () ne fonctionnait pas pour moi dans Safari. Après quelques recherches, j'ai appris que la propriété lastDateModified de l'objet File était obsolète et qu'elle n'était plus prise en charge par Safari. L'utilisation de la propriété lastModified de l'objet File a résolu mes problèmes. Bien sûr, n'aime pas quand de mauvaises informations sont trouvées en ligne.
Merci à tous ceux qui ont contribué à cet article qui m'a aidé à suivre le chemin dont j'avais besoin pour en apprendre davantage sur mon problème. N'eût été cette information, je n'aurais probablement jamais compris mon problème fondamental. Peut-être que cela aidera quelqu'un d'autre dans ma situation similaire.
Je suis également confronté au même problème dans Safari Browser
var date = new Date("2011-02-07");
console.log(date) // IE you get ‘NaN’ returned and in Safari you get ‘Invalid Date’
ici la solution:
var d = new Date(2011, 01, 07); // yyyy, mm-1, dd
var d = new Date(2011, 01, 07, 11, 05, 00); // yyyy, mm-1, dd, hh, mm, ss
var d = new Date("02/07/2011"); // "mm/dd/yyyy"
var d = new Date("02/07/2011 11:05:00"); // "mm/dd/yyyy hh:mm:ss"
var d = new Date(1297076700000); // milliseconds
var d = new Date("Mon Feb 07 2011 11:05:00 GMT"); // ""Day Mon dd yyyy hh:mm:ss GMT/UTC