3
votes

Chaîne de date Javascript invalide

J'essaie d'extraire la date d'une chaîne 20170901000000 . new Date (string) renvoie Date invalide . La chaîne de date me semble assez simple mais apparemment javascript ne la prend pas.

Quels formats la méthode javascript new Date () prend-elle? Existe-t-il un package prenant plus de formats de chaîne de date?

<↑ Modifier: les formats proviennent d'utilisateurs aléatoires. Le YYYYMMDDhhmmss n'est qu'un exemple. Le package doit être capable de déterminer de quel format il s'agit par lui-même et de l'analyser.


14 commentaires

est-ce aaaammjj ... ?


C'est aaaammjjhhmmss


En cas de doute, utilisez la norme ISO. AAAA-MM-JJTHH: mm: ss.nnn + ZZ Où Y est les années complètes, M est le mois, complété par un 0, D est le jour, complété par un 0, T est le lettre littérale T, H est l'heure sur 24, complétée par 0, mm est la minute, rembourrée. ss sont des secondes, remplis, nnn sont des millisecondes et + ZZ est le décalage.


"Valeur de chaîne représentant une date. La chaîne doit être dans un format reconnu par la méthode Date.parse () (horodatages RFC 2822 conformes à l'IETF et également une version d'ISO8601)." developer.mozilla.org/en-US/docs/ Web / JavaScript / Référence /…


Ce format AAAAMMJJHHMMSS provient de l'utilisateur. Nous n'avons pas de contrôle sur les formats qu'ils utilisent


Eh bien, vous devez comprendre le format et l'analyser dans un format pris en charge par date


Si vous le formatez comme ça, il doit s'agir d'un horodatage Unix, sinon il doit s'agir d'une chaîne de date valide spécifiée ici tools.ietf.org/html/rfc2822#page-14


Existe-t-il un package développé pour cela? Nous pourrions obtenir des formats plus rares.


@zhangjinzhou Vous pouvez essayer de diviser la chaîne en ses morceaux, puis les transmettre à Date . Ou utilisez moment.js qui peut analyser une date en fonction d'une chaîne de format spécifique.


@RocketHazmat Oui, je peux facilement comprendre ce format spécifique avec une expression régulière. Cependant, nous ne savons jamais quels formats les utilisateurs utiliseraient. Je me demande s'il existe un package qui comprend déjà beaucoup de formats connus. Je crois que moment.js ne prend que iso.


@zhangjinzhou Vous pouvez dire à moment.js quel format attendre et comment l'analyser: momentjs .com / docs / # / parsing / string-format


personne ne mentionne date-fns ... qui est censé être beaucoup plus rapide que le moment


@RocketHazmat Je n'ai besoin d'aucun outil si je connaissais déjà le format. Les utilisateurs sont aléatoires. Ils peuvent saisir le format de date de leur choix. C'est pourquoi je recherche un package formé qui connaît de nombreux formats et peut deviner quel format est l'entrée de l'utilisateur.


Re: " Y a-t-il un paquet… ". Les demandes de ressources hors site sont hors sujet. La question initiale sur l'analyse syntaxique a reçu de nombreuses réponses ici et il existe de nombreuses ressources contenant des informations sur l'analyse des dates disponibles sur le Web, telles que MDN .


5 Réponses :


0
votes

Utilisez une bibliothèque appropriée comme Moment.js :

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
const date = moment("20170901000000", "YYYYMMDDhhmmss");
console.log(date);


4 commentaires

Ce conseil est un peu discutable: le moment est une dépendance massive à prendre pour faire quelque chose d'aussi trivial.


Je n'aurai besoin d'aucun outil pour l'analyser si je savais déjà que c'était "AAAAMMJJhhmmss". L'outil doit être capable de deviner le format.


L'outil ne peut pas déduire automatiquement le format, car la même chaîne peut correspondre à de nombreux formats. par exemple. votre chaîne "20170901" peut être au format AAAAMMJJ ou AAAJJM ​​.


Une réponse ne doit pas dépendre d'une bibliothèque qui n'est pas étiquetée ou mentionnée dans l'OP. L'analyse de la chaîne OP est de 2 lignes de code, il n'y a pas besoin d'une grande bibliothèque comme moment.js pour une tâche aussi simple.



1
votes

Vous devez analyser votre chaîne de date:

parseDateString = dateStr =>
  dateStr.replace(
    /^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})$/,
    '$1-$2-$3 $4:$5:$6'
  );

console.log(new Date(parseDateString('20170901000000')));

J'espère que cela vous aidera,


7 commentaires

Votre code renvoie null


Quelle est la chaîne d'entrée que vous lui fournissez?


'20170901000000'


Mon code ci-dessus utilise exactement cette chaîne et fonctionne comme il se doit. La valeur renvoyée est "2017-09-01T07: 00: 00.000Z" ;


Sur Chrome, cela fonctionne, mais pas dans Safari.


@arkeros Dépend de la version que vous utilisez. Je suppose que la version que vous utilisez ne prend pas en charge la syntaxe es6.


Ce n'est pas une bonne idée d'analyser la chaîne, puis de créer une autre chaîne qui doit être analysée par l'analyseur intégré (non fiable). Dans ce cas, vous créez une chaîne non standard qui n'est pas analysée par certains navigateurs en cours d'utilisation et aboutit à null . Après avoir analysé la chaîne, appelez simplement le constructeur Date avec les valeurs appropriées.



0
votes

Lorsque vous utilisez un nombre passé à la fonction de date, il doit être au format d'un horodatage unix.

nouvelle date (valeur): Un horodatage Unix qui est une valeur entière représentant le nombre de millisecondes depuis le 1er janvier 1970, 00:00:00 UTC, avec les secondes bissextiles ignorées (Epoque Unix ; mais considérez que la plupart des fonctions d'horodatage Unix comptent en secondes).

Sinon, vous devez générer une chaîne de temps valide :

new Date (dateString): valeur de chaîne représentant une date. La chaîne doit être dans un format reconnu par la méthode Date.parse ()

Puisque votre format est AAAAMMJJHHMMSS et non un horodatage unix, nous pouvons utiliser la dernière approche dateString et utiliser l'expression régulière pour créer une chaîne date valide: p>

let format = '20170901000000'
  .replace(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/, '$1-$2-$3 $4:$5:$6')

console.log('format:', format)
console.log('date:', new Date(format))


0 commentaires

1
votes

vous pouvez diviser cette chaîne et utiliser ceci ..

new Date (YYYY,MM,DD,HH,MM,SS)

/* from mdn */
new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]])


0 commentaires

0
votes

Voir également le [document pour Javascript Date.parse] [1]

Exemples

new Date('2017-09-01 00:00:00');
new Date('Sept 01, 2017 00:00:00');

Pour plus de bibliothèques, vous pouvez utiliser Moment .js ou Day.js


3 commentaires

Le day.js fonctionne pour cet exemple. Cependant, il a son propre problème. Par exemple dayjs ('09012017')


Les questions demandant des ressources hors site sont hors sujet ici, vous n'auriez pas dû répondre à cette partie de la question. Il existe un certain nombre de bibliothèques de dates, pour répondre correctement à cette partie de la question, il faudrait examiner au moins une dizaine des plus populaires et des meilleures (où «meilleur» est déterminé par des critères qui n'incluent pas la popularité).


@RobG Compris, je vais supprimer cette partie, merci.