web-dev-qa-db-fra.com

Utiliser momentjs pour convertir la date en Epoch puis revenir à la date

J'essaie de convertir une chaîne de date en Epoch, puis de revenir à la chaîne de date pour vérifier que je fournis la chaîne de date correcte.

var Epoch = moment("10/15/2014 9:00").unix(); // do I need to do .local()?
var momentDate = moment(Epoch); // I've also tried moment.utc(Epoch) 
var momentDateStr = momentDate.calendar();
alert("Values are: Epoch = " + Epoch + ", momentDateStr = " + momentDateStr);

Renders

Values are: Epoch = 1413378000, momentDateStr = 01/17/1970

Note: J'utilise la version suivante du script moment, //cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.3/moment-with-locales.js

54
Ian Davis

Il y a quelques choses qui ne vont pas ici:

  • Premièrement, la terminologie. "Epoch" fait référence au point de départ de quelque chose. "L’époque Unix" est à minuit, le 1er janvier 1970 UTC. Vous ne pouvez pas convertir une "chaîne de date en n'importe quel jour". Vous vouliez probablement dire "Unix Time" , souvent appelé à tort "Epoch Time".

  • .unix() renvoie le temps Unix en secondes entières, mais le constructeur par défaut moment accepte un horodatage en millisecondes . Vous devriez plutôt utiliser .valueOf() pour renvoyer des millisecondes. Notez que l'appel de .unix()*1000 fonctionnerait également, mais entraînerait une perte de précision.

  • Vous analysez une chaîne sans fournir de spécificateur de format. Ce n'est pas une bonne idée, car des valeurs telles que 1/2/2014 pourraient être interprétées comme étant le 1er février ou le 2 janvier, en fonction de la localisation du code. (C’est également pourquoi vous obtenez l’avertissement de dépréciation dans la console.) A la place, indiquez un chaîne de format correspondant à l’entrée attendue, tel que:

    moment("10/15/2014 9:00", "M/D/YYYY H:mm")
    
  • .calendar() a une utilisation très spécifique. Si vous êtes proche de la date, une valeur telle que "Aujourd'hui à 09h00" sera renvoyée. Si ce n'est pas ce à quoi vous vous attendiez, utilisez plutôt la fonction .format() . Encore une fois, vous voudrez peut-être passer un spécificateur de format.

  • Pour répondre à vos questions en commentaires, non - vous n'avez pas besoin d'appeler .local() ou .utc().

Mettre tous ensemble:

var ts = moment("10/15/2014 9:00", "M/D/YYYY H:mm").valueOf();
var m = moment(ts);
var s = m.format("M/D/YYYY H:mm");
alert("Values are: ts = " + ts + ", s = " + s);

Sur ma machine, dans le fuseau horaire américain du Pacifique, il en résulte:

Les valeurs sont les suivantes: ts = 1413388800000, s = 10/15/2014 9:00

Puisque la valeur d'entrée est interprétée en termes d'heure locale, vous obtiendrez une valeur différente pour ts si vous vous trouvez dans un fuseau horaire différent.

Notez également que si vous voulez vraiment travailler avec des secondes entières (peut-être perdre en précision), moment a également des méthodes pour cela. Vous utiliseriez .unix() pour renvoyer l'horodatage en secondes, et moment.unix(ts) pour le réanalyser à un moment donné.

var ts = moment("10/15/2014 9:00", "M/D/YYYY H:mm").unix();
var m = moment.unix(ts);
132
Matt Johnson-Pint

http://momentjs.com/docs/#/displaying/unix-timestamp/

Vous obtenez le nombre de secondes unix, pas des millisecondes!

Vous devez le multiplier par 1000 ou par valueOf() et n'oubliez pas d'utiliser un formateur, car vous utilisez un Format non ISO 8601. Et si vous oubliez de passer le formateur, la date sera analysée dans le fuseau horaire UTC ou comme une date invalide.

moment("10/15/2014 9:00", "MM/DD/YYYY HH:mm").valueOf()
8
timaschew