2013-08-01 15 views
372

Użycie obiektu Moment.js Nie można przekształcić obiektu z właściwym momentem w obiekt daty ze strefami czasowymi. Nie mogę uzyskać prawidłowej daty.Moment.js przekształcić do obiektu daty

Przykład:

var oldDate = new Date(), 
    momentObj = moment(oldDate).tz("MST7MDT"), 
    newDate = momentObj.toDate(); 
console.log("start date " + oldDate) 
console.log("Format from moment with offset " + momentObj.format()) 
console.log("Format from moment without offset " + momentObj.utc().format()) 
console.log("(Date object) Time with offset " + newDate) 
console.log("(Date object) Time without offset "+ moment.utc(newDate).toDate()) 
+1

Co wyjście oczekujesz i co wyjście otrzymujesz? –

+2

4 rząd dostać mnie, więc wyjście: (Date object) Time with offset Thu Aug 01 2013 15:23:49 GMT+0300 (Финляндия (лето)) Ale strefa czasowa musi być MST7MDT –

Odpowiedz

690

Służy do transformowania obiektu chwilę do obiektu data:

Od http://momentjs.com/docs/#/displaying/as-javascript-date/

moment().toDate(); 

Wynik:

Tue Nov 04 2014 14:04:01 GMT-0600 (CST) 
+2

@Spencer - Tak, odpowiada na tytuł, a 'toDate' to sposób uzyskania obiektu' Date' z 'chwili'. Ale kod w treści pytania pyta o konwersję strefy czasowej - czego 'Date' nie może zrobić. O ile czas górski nie jest rzeczywiście strefą czasową użytkownika, to nie jestem pewien, w jaki sposób ta odpowiedź na to pytanie. –

+1

@Matt to tylko zależy od tego, na którą część pytania się patrzysz. Większość osób wyszukuje google i widzi, że ten tytuł pokrywa się z ich pytaniem i popiera odpowiedź, która zawiera tytuł, a nie treść pytania. To może wyjaśnić, dlaczego ma najwięcej głosów, nawet jeśli nie pomaga technicznie PO. – Spencer

+6

Czy to właściwie jest właściwa odpowiedź? Pytanie brzmiało, jak zmienić obiekt momentu na datę javascript, ale za pomocą TIMEZONE. Nadal powraca do lokalnej strefy czasowej, gdy zmienia się obiekt daty javascript. – Unspeakable

30

Dopóki masz zainicjowany moment-timezone z the data for the zones you want Twój kod działa zgodnie z oczekiwaniami.

Poprawnie przeliczasz moment na strefę czasową, co jest odzwierciedlone w drugim wierszu pliku wyjściowego z momentObj.format().

Przełączenie na UTC nie tylko usuwa przesunięcie, lecz także zmienia strefę czasową UTC. Jeśli masz zamiar to zrobić, w ogóle nie potrzebujesz oryginalnego połączenia .tz(). Możesz po prostu zrobić moment.utc().

Być może próbujesz zmienić ciąg formatu wyjściowego? Jeżeli tak, wystarczy określić parametry chcesz sposobu format:

momentObj.format("YYYY-MM-DD HH:mm:ss") 

chodzi o ostatnie linie kodu - gdy wrócisz do Date obiektu przy użyciu toDate(), dajesz się zachowanie chwili. js i powrót do zachowania JavaScript. Obiekt JavaScript Date będzie zawsze drukowany w lokalnej strefie czasowej komputera, na którym działa. Nie ma nic, co mógłby zrobić skrypt instant.js.

Kilka innych drobnych rzeczy:

  • Chociaż chwila konstruktor może wziąć Date, to zazwyczaj najlepiej nie używać jednego. W przypadku "teraz" nie używaj moment(new Date()). Zamiast tego po prostu użyj moment(). Oba będą działać, ale będą niepotrzebnie zbędne. Jeśli parsujesz z łańcucha, przekazuj ten ciąg bezpośrednio do momentu. Nie próbuj najpierw analizować tego jako Date. Parser momentu jest o wiele bardziej niezawodny.

  • Strefy czasowe takie jak MST7MDT są ze względów kompatybilności wstecznej. Wynikają one ze stref czasowych w stylu POSIX, a tylko kilka z nich znajduje się w danych TZDB. Jeśli nie jest to absolutnie konieczne, należy użyć klucza, takiego jak America/Denver.

+0

Dzięki Matt! Twoja odpowiedź była przydatna. Jak wspomniałeś o użyciu America/Denver zamiast MST7MDT, Czy istnieje mapa dostępna dla tych mapowań? Używam sporo takich stref czasowych, jak CET, EET, EST5EDT, CST6CDT, PST8PDT. – Monish

+2

http://wikipedia.org/wiki/List_of_tz_database_time_zones –

+0

czy możliwe jest przekonwertowanie np: "10:20 AM" (Uzyskany czas ciągu od momentu(). Format ("hh: mm A")) do obiektu Date? – ram

12

.toDate tak naprawdę nie działa dla mnie, więc , Oto co zrobiłem:

futureStartAtDate = new Date(moment().locale("en").add(1, 'd').format("MMM DD, YYYY HH:MM")) 

nadzieję, że to pomaga

3

Musiałem mieć strefy czasowej w moim data ciąg.Pierwotnie używałem moment.tz(dateStr, 'America/New_York').toString();, ale potem zaczęły pojawiać się błędy związane z podawaniem tego ciągu z powrotem do momentu.

Próbowałem moment.tz(dateStr, 'America/New_York').toDate();, ale wtedy straciłem informacje o strefach czasowych, które były mi potrzebne.

Jedynym rozwiązaniem, które zwróciło użytkowej datę ciąg ze strefy czasowej, które mogą być zasilane z powrotem do chwili było moment.tz(dateStr, 'America/New_York').format();