Ответ 1
По умолчанию MomentJS анализирует по местному времени. Если предоставляется только строка даты (без времени), по умолчанию используется значение по умолчанию до полуночи.
В вашем коде вы создаете локальную дату, а затем конвертируете ее в часовой пояс UTC (фактически, он переключает экземпляр экземпляра на режим UTC), поэтому когда он отформатирован, он сдвигается (в зависимости от вашего локального времени) вперед или назад.
Если локальный часовой пояс UTC + N (N - положительное число), и вы анализируете строку только для даты, вы получите предыдущую дату.
Вот несколько примеров, чтобы проиллюстрировать это (мое местное смещение по времени - UTC + 3 во время DST):
>>> 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"