Za pomocą Moment.js nie mogę przekształcić prawidłowego obiektu momentu 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())
javascript
momentjs
vadim.zhiltsov
źródło
źródło
Wednesday 24th 2019, 12:47:48 am
czy można to przekonwertować2019-04-23T19:17:48.000Z
? @ vadim.zhiltsov.tz("MST7MDT")
. Właśnie dlatego istnieją biblioteki takie jak moment.tz, aby uzupełnić możliwości gołych kości wbudowanego obiektu Date, który rozumie tylko UTC i strefę czasową hosta, to wszystko.Odpowiedzi:
Użyj tego, aby przekształcić obiekt momentu w obiekt daty:
From http://momentjs.com/docs/#/displaying/as-javascript-date/
Wydajność:
źródło
toDate
rzeczywiście jest sposobem uzyskaniaDate
obiektu zmoment
. Ale kod w treści pytania pyta o konwersję strefy czasowej - czegoDate
nie można zrobić. O ile czas górski nie jest strefą czasową użytkownika, to nie jestem pewien, jak to odpowiedziało na pytanie.moment("12/12/2011")
dostanie tę wiadomość. Nie ma to nic wspólnego z chodzeniem od chwili do tej pory objmoment().toDate()
Tak długo, jak zainicjowałeś strefę czasową z danymi dla żądanych stref , Twój kod działa zgodnie z oczekiwaniami.
Poprawnie konwertujesz moment do strefy czasowej, co znajduje odzwierciedlenie w drugim wierszu wyniku z
momentObj.format()
.Przełączenie na UTC nie tylko obniża przesunięcie, ale wraca do strefy czasowej UTC. Jeśli masz zamiar to zrobić, wcale nie potrzebujesz oryginalnego
.tz()
połączenia. Możesz po prostu zrobićmoment.utc()
.Być może po prostu próbujesz zmienić ciąg formatu wyjściowego? Jeśli tak, po prostu określ parametry, które chcesz zastosować do
format
metody:Odnośnie do ostatnich wierszy kodu - gdy wracasz do
Date
obiektutoDate()
, rezygnujesz z zachowania mom.js i wracasz do zachowania JavaScript. JavaScriptDate
będzie zawsze drukowany w lokalnej strefie czasowej komputera, na którym działa. Nic nie może zrobić w tym momencie.Kilka innych drobiazgów:
Podczas gdy konstruktor może zająć
Date
, zwykle najlepiej nie używać go. W przypadku „teraz” nie używajmoment(new Date())
. Zamiast tego po prostu użyjmoment()
. Oba będą działać, ale są niepotrzebnie zbędne. Jeśli parsujesz z ciągu, przekaż ten ciąg bezpośrednio do momentu. Nie próbuj go parsować wDate
pierwszej kolejności. Przekonasz się, że parser momentu jest znacznie bardziej niezawodny.Strefy czasowe
MST7MDT
są dostępne ze względu na kompatybilność wsteczną. Wywodzą się one ze stref czasowych w stylu POSIX, a tylko kilka z nich znajduje się w danych TZDB. O ile nie jest to absolutnie konieczne, powinieneś użyć klucza takiego jakAmerica/Denver
.źródło
.toDate()
. 2) Nie używaj komentarzy do zadawania nowych pytań. Do tego służy duży przycisk „Zadaj pytanie” ..toDate
tak naprawdę nie działało dla mnie, więc oto co zrobiłem:mam nadzieję że to pomoże
źródło
moment().add(1, 'd').toDate()
.Ponieważ momentjs nie ma kontroli nad obiektem daty javascript, znalazłem rozwiązanie tego problemu.
To da ci obiekt daty javascript z konwertowanym czasem
źródło
Musiałem mieć informacje o strefie czasowej w swoim ciągu daty. Pierwotnie używałem,
moment.tz(dateStr, 'America/New_York').toString();
ale potem zacząłem dostawać błędy dotyczące podawania tego ciągu z powrotem do momentu.Próbowałem,
moment.tz(dateStr, 'America/New_York').toDate();
ale potem straciłem potrzebne informacje o strefie czasowej.Jedynym rozwiązaniem, które zwróciło przydatny ciąg daty ze strefą czasową, który można było przywrócić do chwili, było
moment.tz(dateStr, 'America/New_York').format();
źródło
ładne i czyste !!!!
źródło
Aby przekonwertować dowolną datę, na przykład utc:
źródło
moment().utc()
zwraca wartości dla UTC, a następnie.format( "YYYY-MM-DD HH:mm:ss" )
zwraca ciąg, który został ustawiony na UTC bez przesunięcia strefy czasowej, więc jest analizowany jako lokalny. Nie pasuje do domyślnego formatu momentu, więc jest analizowany przez wbudowany parser. Nie pasuje też do żadnego formatu obsługiwanego przez ECMAScript, więc parsowanie zależy od implementacji. W każdym razie jest on analizowany jako lokalny, więc przesunięcie strefy czasowej jest ponownie stosowane podczas tworzenia wartości czasu dla daty.Pytanie jest trochę niejasne. Zrobię co w mojej mocy, aby to wyjaśnić. Najpierw powinieneś zrozumieć, jak korzystać ze strefy czasowej . Zgodnie z tą odpowiedzią tutaj TypeError: moment (). Tz nie jest funkcją , musisz zaimportować moment ze strefy chwilowej zamiast domyślnej (oczywiście musisz najpierw zainstalować npm strefę czasową!). Ze względu na przejrzystość,
Teraz, aby użyć funkcji strefy czasowej, użyj moment.tz („date_string / moment ()”, „time_zone”) ( więcej szczegółów na stronie https://momentjs.com/timezone ). Ta funkcja zwróci obiekt chwilowy z określoną strefą czasową. Ze względu na przejrzystość,
Teraz, gdy spróbujesz przekonwertować newYork (obiekt momentu) za pomocą metody moment toDate () (konwersja formatu ISO 8601), otrzymasz czas z Greenwich w Wielkiej Brytanii. Aby uzyskać więcej informacji, przejdź do tego artykułu https://www.nhc.noaa.gov/aboututc.shtml , o UTC. Jeśli jednak chcesz tylko mieć czas lokalny w tym formacie (zgodnie z tym przykładem czas nowojorski), po prostu dodaj metodę .utc (true) , z arg true , do obiektu momentu. Ze względu na przejrzystość,
W skrócie, moment.tz uwzględnia podaną strefę czasową i porównuje czas lokalny z czasem w Greenwich, aby dać ci wynik. Mam nadzieję, że było to przydatne.
źródło
moment zaktualizował bibliotekę js od 06/2018.
jeśli masz swobodę korzystania z Angular5 +, lepiej użyj funkcji datePipe niż funkcji strefy czasowej tutaj. Muszę użyć moment.js, ponieważ mój projekt ogranicza się tylko do Angular2.
źródło
spróbuj (bez
format
kroku)Pokaż fragment kodu
źródło
new Date(moment())
jest równoważne znew Date()
. Strefa czasowa jest ustawiona tylko dla d .