Подтвердить что ты не робот

Использование momentjs для преобразования даты в эпоху, а затем назад

Я пытаюсь преобразовать строку даты в эпоху, а затем вернуться к строке даты, чтобы проверить, что я предоставляю правильную строку даты.

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

Визуализирует

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

Примечание. Я использую следующую версию момента js script,//cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.3/moment-with-locales.js

4b9b3361

Ответ 1

Здесь есть несколько ошибок:

  • Во-первых, терминология. "Epoch" относится к отправной точке чего-то. "Эпоха Unix" - полночь, 1 января 1970 UTC. Вы не можете преобразовать произвольную "строку даты в эпоху". Вероятно, вы имели в виду "Unix Time" , который часто ошибочно называют "Epoch Time".

  • .unix() возвращает Unix Time в течение целых секунд, но конструктор moment по умолчанию принимает метку времени в миллисекундах. Вместо этого вы должны использовать .valueOf() для возврата миллисекунд. Обратите внимание, что вызов .unix()*1000 также будет работать, но это приведет к потере точности.

  • Вы разбираете строку без указания спецификатора формата. Это не очень хорошая идея, так как значения, например, 1/2/2014, могут быть интерпретированы как 1 февраля, так и 2 января, в зависимости от того, где работает код. (Это также означает, что вы получаете предупреждение об устаревании в консоли.) Вместо этого укажите строку формата, которая соответствует ожидаемому вводу, например:

    moment("10/15/2014 9:00", "M/D/YYYY H:mm")
    
  • .calendar() имеет очень специфическое применение. Если вы приближаетесь к дате, она вернет значение, например "Сегодня 9:00 AM". Если это не то, что вы ожидали, вы должны использовать .format(). Опять же, вы можете передать спецификатор формата.

  • Чтобы ответить на ваши вопросы в комментариях, нет - вам не нужно вызывать .local() или .utc().

Объединяя все это:

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

На моей машине в часовом поясе США в Тихоокеанском регионе это приводит к:

Значения: ts = 1413388800000, s = 10/15/2014 9:00

Поскольку входное значение интерпретируется в терминах локального времени, вы получите другое значение для ts, если вы находитесь в другом часовом поясе.

Также обратите внимание, что если вы действительно хотите работать целыми секундами (возможно, теряя точность), у моментов есть методы для этого. Вы должны использовать .unix(), чтобы вернуть метку времени в целые секунды, и moment.unix(ts), чтобы разобрать ее на мгновение.

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

Ответ 2

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

Вы получаете количество секунд unix, а не миллисекунды!

Вам нужно умножить его на 1000 и не забывайте использовать форматтер, так как вы используете формат не ISO 8601. И если вы забудете передать форматтер, дата будет проанализирована в часовом поясе UTC или в качестве недопустимой даты.

moment(moment("10/15/2014 9:00", "MM/DD/YYYY HH:mm").unix()*1000)