Pytanie Obiekt transformacji Moment.js do daty


Za pomocą 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.

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())

423
2017-08-01 07:25


pochodzenie


Jakich wyników oczekujesz i jakie wyniki osiągasz? - Felix Kling
4 wiersz, aby uzyskać dane wyjściowe: <code> (obiekt Date) Czas z przesunięciem Thu Aug 01 2013 15:23:49 GMT + 0300 (Финляндия (лето)) </ code> Ale strefą czasową musi być MST7MDT - vadim.zhiltsov


Odpowiedzi:


Użyj tego, aby przekształcić obiekt momentowy w obiekt daty:

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

moment().toDate();

Wydajność:

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

788
2017-11-04 20:06



@Spencer - Tak, odpowiada tytułowi, i toDate jest naprawdę jak zdobyć Dateobiekt od moment. Ale kod w treści pytania pyta o konwersję strefy czasowej - która Date nie móc 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. - Matt Johnson
@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
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
Hej, ludzie, sprawdźcie ten link momentjs.com/guides/#/warnings/js-date. Jest to odradzane i zostanie usunięte w nadchodzącym wydaniu głównym. - gtzinos
@ gtzinos to, co łączysz i powołujesz się na oddzielny problem i scenariusz, np. podanie ciągu znaków do konstruktora momentu moment("12/12/2011") jest tam, gdzie otrzymasz tę wiadomość. Nie ma to nic wspólnego z odejściem od chwili do chwili moment().toDate() - btbJosh


Dopóki inicjalizujesz moment-strefa czasowa z dane dla stref, które chceszTwój kod działa zgodnie z oczekiwaniami.

Poprawnie przeliczasz moment na strefę czasową, która jest odzwierciedlona w drugim wierszu wyjścia momentObj.format().

Przejście na UTC nie tylko powoduje zniesienie offsetu, lecz także powrót do strefy czasowej UTC. Jeśli masz zamiar to zrobić, nie potrzebujesz oryginału .tz() w ogóle zadzwoń. Możesz po prostu zrobić moment.utc().

Być może próbujesz zmienić ciąg formatu wyjściowego? Jeśli tak, określ parametry, które chcesz format metoda:

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

Odnośnie ostatniego wiersza kodu - po powrocie do Date obiekt za pomocą toDate(), rezygnujesz z zachowania pliku moment.js i powracasz do zachowania JavaScript. JavaScript Date obiekt 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 drobiazgów:

  • W chwili konstruktora mogą weź a Date, zazwyczaj najlepiej go nie używać. Dla "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 parsować tego do a Date pierwszy. Parser momentu jest o wiele bardziej niezawodny.

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


35
2017-08-01 13:14



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. - monish001
wikipedia.org/wiki/List_of_tz_database_time_zones - Matt Johnson
czy możliwe jest przekonwertowanie np .: "10:20 AM" (Otrzymany czas ciągu od momentu (). format ("hh: mm A")) do obiektu Date? - ram
@ram - 1) jeśli masz chwilę, po prostu użyj .toDate(). 2) Nie używaj komentarzy, aby zadawać nowe pytania. To jest to, co wielkie "Zadaj pytanie" przycisk jest dla. - Matt Johnson


.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"))

mam nadzieję że to pomoże


17
2018-03-13 10:04





Potrzebowałem informacji o strefie czasowej w ciągu dat. Pierwotnie używałem moment.tz(dateStr, 'America/New_York').toString(); ale potem zaczęły pojawiać się błędy związane z doprowadzeniem tego ciągu do momentu.

Próbowałem moment.tz(dateStr, 'America/New_York').toDate(); ale wtedy straciłem informacje o strefach czasowych, których potrzebowałem.

Jedyne rozwiązanie, które zwróciło użyteczny łańcuch daty ze strefą czasową to mogło zostać przywrócone do momentu moment.tz(dateStr, 'America/New_York').format();


4
2018-03-19 04:35





moment zaktualizował bibliotekę js od 06/2018.

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00

jeśli masz swobodę używania Angular5 +, lepiej korzystaj z funkcji datePipe niż funkcja strefy czasowej tutaj. Muszę użyć pliku moment.js, ponieważ mój projekt ogranicza się tylko do Angular2.


1
2018-06-13 16:12