<p>moment (). fromNow () renvoie 'Date invalide'</p>

Créé le 7 oct. 2018  ·  10Commentaires  ·  Source: moment/moment

Description du problème et étapes à suivre pour le reproduire:
J'utilise moment pour connaître l'âge du compte d'un utilisateur, en utilisant:
moment(user account created date here).fromNow() mais il renvoie 'Date invalide'. Cela fonctionnait avant mais cela ne fonctionne plus. La date de création ressemble à quelque chose comme: 2018-06-07T22:54:07.310Z .
Utiliser moment(date here).format() fonctionne bien.
Veuillez inclure les valeurs de toutes les variables utilisées.
La date que j'utilise pour formater et utiliser fromNow est 2018-06-07T22:54:07.310Z
Environnement:
Discord Bot
Exemples: Chrome 49 sur OSX, Internet Explorer 10 sur Windows 7, Node.JS 4.4.4 sur Ubuntu 16.0.4
Je n'utilise pas moment pour tout ce qui est énuméré ci-dessus.
Le navigateur et le système d'exploitation sont tous deux importants pour nous, en particulier si vous avez un environnement inhabituel comme une application IOT.

Autres informations pouvant être utiles: https://i.imgur.com/4LFsZh3.png

  • Le réglage du fuseau horaire de la machine sur laquelle le code s'exécute: PST
  • L'heure et la date à laquelle le code a été exécuté: 12h20, 7/10/18
  • Autres bibliothèques utilisées (TypeScript, Immutable.js, etc.) Aucune

Si vous signalez un problème, exécutez le code suivant dans l'environnement que vous utilisez et incluez la sortie:

console.log( (new Date()).toString())
console.log((new Date()).toLocaleString())
console.log( (new Date()).getTimezoneOffset())
console.log( navigator.userAgent)
console.log(moment.version)

Dim 07 octobre 2018 12:29:05 GMT-0700 (Heure avancée du Pacifique)
2018-10-7 12:29:05
420
2.22.2
Assurez-vous que votre problème est isolé au moment.

Bug

Commentaire le plus utile

Merci pour la réponse. J'utilise NodeJS, il n'y a donc pas d'environnement de navigateur.

new Date ()). toString () Thu Jan 17 2019 06:53:11 GMT-0600 (Central Standard Time)
nouvelle Date ()). toLocaleString (): 17/01/2019, 6:53:11 AM
nouvelle Date ()). getTimezoneOffset (): 360
moment.version: 2.23.0
NodeJS est la version 11.6.0

J'ai fait des tests et le conflit est un constructeur Object.prototype.

Object.prototype.test = function () {
    return test
}

const moment = require('moment');

const time = moment('2017-08-08T18:29:07.000Z')
console.log(time.isValid()) // true
console.log(time.toNow()) // Invalid date
console.log(time.fromNow()) // Invalid date

Tous les 10 commentaires

Comment exécutez-vous votre Discord Bot?

Vous avez dit: _ "Cela fonctionnait avant mais cela ne fonctionne plus" _
Quelque chose a-t-il changé depuis que cela fonctionnait - par exemple, avez-vous mis à jour l'environnement sur lequel fonctionne votre bot Discord? Le format de la «date de création du compte utilisateur» a-t-il changé?

Êtes-vous en mesure de modifier le code de votre bot discord pour afficher la sortie de ce qui suit (en utilisant spécifiquement des chaînes codées en dur):

console.log('moment.format:', moment("2018-06-07T22:54:07.310Z").format());
console.log('moment.fromNow:', moment("2018-06-07T22:54:07.310Z").fromNow());

Cela fonctionnait avant de s'arrêter. Aucun code modifié. Aucun environnement n'a changé avec le bot. La façon dont les dates sont analysées semble également la même.

Et voici ce que la console a produit;

moment.format: 2018-06-07T15:54:07-07:00
moment.fromNow: Invalid date

et voici comment je l'ai utilisé ( this.client.moment est la façon dont j'ai défini le moment):

 console.log('moment.format:', this.client.moment("2018-06-07T22:54:07.310Z").format());
console.log('moment.fromNow:', this.client.moment("2018-06-07T22:54:07.310Z").fromNow());

Je ne sais pas si je l'ai mentionné ou non, mais voici les versions actuelles que j'utilise:
"moment": "^ 2.22.2",
"moment-durée-format": "^ 2.2.2"
et je suis sur la v8.9.2 du nœud

J'ai un problème similaire avec Angular 6 (application basée sur les ions) et le moment 2.22.2 renvoie une date invalide pour quelque chose d'aussi simple que cela.
moment(new Date()).fromNow();
s'il vous plaît donnez votre avis.

Toujours en cours dans la version 2.23.0

time = moment('2017-08-08T18:29:07.000Z')
time.isValid() // true
time.toNow() // Invalid date
time.fromNow() // Invalid date

Merci d'avoir ouvert cette demande
Salut! Merci d'avoir signalé ce problème! Malheureusement, je ne peux pas reproduire cela. Pouvez-vous fournir d'autres informations?

Cela aide si vous exécutez ces lignes sur vos machines:

console.log( (new Date()).toString())
console.log((new Date()).toLocaleString())
console.log( (new Date()).getTimezoneOffset())
console.log( navigator.userAgent)
console.log(moment.version)

Merci pour la réponse. J'utilise NodeJS, il n'y a donc pas d'environnement de navigateur.

new Date ()). toString () Thu Jan 17 2019 06:53:11 GMT-0600 (Central Standard Time)
nouvelle Date ()). toLocaleString (): 17/01/2019, 6:53:11 AM
nouvelle Date ()). getTimezoneOffset (): 360
moment.version: 2.23.0
NodeJS est la version 11.6.0

J'ai fait des tests et le conflit est un constructeur Object.prototype.

Object.prototype.test = function () {
    return test
}

const moment = require('moment');

const time = moment('2017-08-08T18:29:07.000Z')
console.log(time.isValid()) // true
console.log(time.toNow()) // Invalid date
console.log(time.fromNow()) // Invalid date

Je suis également touché par cela.
Au début, je pensais que l'utilisation d'un horodatage unix incomplet (comment les données me sont fournies) dans le constructeur en était la cause, mais en testant l'exemple de code dans la documentation de MomentJS, j'ai trouvé que tout appel à fromNow() a renvoyé Invalid Date .

Même problème ici.

toString Tue Jan 07 2020 10:20:09 GMT+0100 (Central European Standard Time)
toLocaleString 1/7/2020, 10:20:09 AM
getTimezoneOffset -60
navigator.userAgent Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0
moment.version 2.24.0

Idem ici sur "moment": "^2.24.0", . Cela fonctionne bien lorsqu'il est exécuté sur le navigateur mais échoue dans nodejs. Une solution de contournement jusqu'à ce qu'elle soit réparée? @marwahaha

C'est un hack, mais vous pouvez changer les extensions Object.prototype pour qu'elles ne soient pas énumérables:

console.log(moment().fromNow()); // 'a few seconds ago'
Object.prototype.randomExtension = true;
console.log(moment().fromNow()); // 'Invalid date'

Object.keys(Object.prototype).forEach(function(extension) {
  Object.defineProperty(Object.prototype, extension, { enumerable: false });
});

console.log(moment().fromNow()); // 'a few seconds ago'
Cette page vous a été utile?
0 / 5 - 0 notes