Ответ 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);