Domyślnie MomentJS analizuje w czasie lokalnym. Jeśli podano tylko ciąg daty (bez godziny), domyślną godziną jest północ.
W swoim kodzie tworzysz lokalną datę, a następnie konwertujesz ją na strefę czasową UTC (w rzeczywistości powoduje ona przełączenie instancji momentu w tryb UTC ), więc po sformatowaniu jest przesuwana (w zależności od czasu lokalnego) do przodu lub wstecz.
Jeśli lokalna strefa czasowa to UTC + N (N jest liczbą dodatnią) i przeanalizujesz ciąg zawierający tylko datę, otrzymasz poprzednią datę.
Oto kilka przykładów ilustrujących to (moje lokalne przesunięcie czasu to UTC + 3 podczas czasu letniego):
>>> 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)"
Jeśli chcesz, aby ciąg daty i czasu był interpretowany jako UTC, powinieneś o tym wyraźnie powiedzieć:
>>> moment(new Date('07-18-2013 UTC')).utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"
lub, jak wspomina Matt Johnson w swojej odpowiedzi, możesz ( i prawdopodobnie powinieneś ) przeanalizować ją jako datę UTC w pierwszej kolejności, używając moment.utc()
i dołączając łańcuch formatu jako drugi argument, aby zapobiec niejednoznaczności.
>>> moment.utc('07-18-2013', 'MM-DD-YYYY').format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"
Aby przejść na drugą stronę i przekonwertować datę UTC na datę lokalną, możesz użyć local()
metody w następujący sposób:
>>> moment.utc('07-18-2013', 'MM-DD-YYYY').local().format("YYYY-MM-DD HH:mm")
"2013-07-18 03:00"
toString()
poformat()
(już zwraca ciąg).