По умолчанию MomentJS анализирует локальное время. Если предоставляется только строка даты (без времени), время по умолчанию равно полуночи.
В вашем коде вы создаете локальную дату, а затем конвертируете ее в часовой пояс UTC (фактически, он переключает экземпляр экземпляра на UTC mode), поэтому, когда он отформатирован, он сдвигается (в зависимости от вашего местного времени) вперед или назад.
Если местный часовой пояс UTC + N (N - положительное число), и вы разбираете строку только для даты, вы получите предыдущую дату.
Вот несколько примеров, иллюстрирующих это (мое местное время смещение UTC + 3 в течение летнего времени):
>>> moment('07-18-2013', 'MM-DD-YYYY').utc().format("YYYY-MM-DD HH:mm")
"2013-07-17 21:00"
>>> moment('07-18-2013 12:00', 'MM-DD-YYYY HH:mm').utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 09:00"
>>> Date()
"Thu Jul 25 2013 14:28:45 GMT+0300 (Jerusalem Daylight Time)"
Если вы хотите даты и времени строку истолковано как UTC, вы должны быть четко об этом:
>>> moment(new Date('07-18-2013 UTC')).utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"
или, как Мэтт Джонсон упоминает в своем ответе, вы можете (и, вероятно, должен) разобрать его в качестве даты UTC, в первую очередь с использованием moment.utc()
и включают в себя строку формата в качестве второго аргумента для предварительного неоднозначность.
>>> moment.utc('07-18-2013', 'MM-DD-YYYY').format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"
Чтобы перейти в другую сторону вокруг и преобразовать дату в формате UTC к местному времени, вы можете использовать метод local()
следующим образом:
>>> moment.utc('07-18-2013', 'MM-DD-YYYY').local().format("YYYY-MM-DD HH:mm")
"2013-07-18 03:00"
Я не думаю, что вам нужно 'toString()' after' format() '(он уже возвращает строку). – alex