За замовчуванням 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()
(це вже повертає рядок).