Domyślnie MomentJS analizuje w czasie lokalnym. Jeśli podano tylko łańcuch daty (bez czasu), domyślnie jest godzina północna.
W kodzie utworzysz lokalną datę, a następnie przekształcisz ją w strefę czasową UTC (w rzeczywistości zmieni się ona na UTC mode), więc po sformatowaniu zostanie przesunięta (w zależności od czasu lokalnego)) do przodu lub do tyłu.
Jeśli lokalna strefa czasowa ma wartość UTC + N (N oznacza liczbę dodatnią), a przeanalizujesz ciąg z datą, otrzymasz poprzednią datę.
Oto kilka przykładów, aby go ilustrować (mój czas lokalny offset UTC + 3 podczas 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)"
Jeśli chcesz ciąg data-czas interpretowany jako UTC, powinno być jawne o nim:
>>> moment(new Date('07-18-2013 UTC')).utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"
lub, jak Matt Johnson wspomina w swojej odpowiedzi, można (i prawdopodobnie powinien ) przetworzy go jako data UTC w pierwszej kolejności przy użyciu moment.utc()
i zawierają ciąg formatu jako drugi argument pre uwolnić dwuznaczność.
>>> moment.utc('07-18-2013', 'MM-DD-YYYY').format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"
Aby przejść na odwrót i przekonwertować datę UTC do lokalnej daty, można użyć metody local()
, co następuje:
>>> moment.utc('07-18-2013', 'MM-DD-YYYY').local().format("YYYY-MM-DD HH:mm")
"2013-07-18 03:00"
Nie sądzę, że potrzebujesz 'toString()' after 'format()' (już zwraca ciąg znaków). – alex