web-dev-qa-db-fra.com

Date invalide dans le safari

 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.

121
Shrinath

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 :

  • MM-JJ-AAAA
  • aaaa/mm/jj
  • MM/JJ/AAAA
  • MMMM jj, aaaa
  • MMM jj, aaaa

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");
140
darioo

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, "/")));
182
Elzo Valugi

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
30
nizantz

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();
9
liwp_Stephen

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.

Centre de développement IE: Objet de date (JavaScript)

Réseau de développement Mozilla: Date

8
Luxx

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

6

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);
4
Sampath

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().

3
Phrogz

Que diriez-vous de Hijack Date avec fix-date ? Aucune dépendance, min + gzip = 280 B

1
kenberkeley

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

1
Abhay Aradhya

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.

1
Daniël Brito

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

0

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.

0
S. Costello

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 
0
venkatSkpi