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