2013-08-02 17 views
15

mam serwis internetowy, który powraca jako datę następujący ciąg:Moment.js i Unix Epoch Konwersja

/Date(1377907200000)/

używam MomentJS analizować to do moment obiektu.

moment("/Date(1377907200000)/") =>Fri Aug 30 2013 20:00:00 GMT-0400

Wszystko to jest w porządku. Ale kiedy zadzwonię na unix() na obiekcie, otrzymuję wartość 1377907200. To jednak odpowiada Fri Jan 16 1970 17:45:07 GMT-0500. Mogę po prostu pomnożyć wartość zwróconą przez unix(), ale wydaje mi się to niechlujne. Podejrzewam, że to, co robię, nazywając unix(), nie jest dokładnie tym, czym myślę, że jest. Czy muszę podać jakiś format podczas dzwonienia pod numer unix()? Czego tu mi brakuje?

JSFidle showing the conversion to moment and then back.

+0

Nie trzeba konwertować na obiekt daty w ten sposób, moment może obsłużyć 'moment (1377907200000)' po prostu dobrze. Ciekawe, dlaczego usługa sieciowa zwraca datę jako taką. – mix3d

+0

Korzystamy z usługi sieciowej, która ją zwraca. Dzieje się tak, ponieważ docelowym użytkownikiem interfejsu API jest zazwyczaj JavaScript, który zamiast "sekund" zajmuje "Epokę w milisekundach". Jest skierowany do najbardziej prawdopodobnego konsumenta. –

Odpowiedz

48

Odpowiedź dostarczona przez meagar jest poprawna, z ściśle określonej perspektywy czasowej JavaScript/Unix. Jeśli jednak pomnożysz przez 1000, utracisz dokładność pod sekundę, która mogła istnieć w twoich danych.

Moment.js oferuje dwie różne metody, zgodnie z opisem in the docs. .unix() zwraca wartość w sekundach. Efektywnie dzieli się przez 1000 i obcina wszelkie miejsca dziesiętne. Chcesz użyć metody .valueOf(), która po prostu zwraca milisekundy bez modyfikacji.

+1

Dzięki za dodatkowe szczegóły. Przynajmniej dla tego przedmiotu, który nie byłby potrzebny, ponieważ ziarnistość wynosi zaledwie jeden dzień. –

+0

O tak, widzę, że to dokładnie to, czego się spodziewałem. Wolałbym nie modyfikować wartości w żaden sposób, więc twoja odpowiedź w rzeczywistości jest idealna. –

+0

Przepraszam, meagar .. –

10

W ziemi JavaScript, podczas konwertowania Date do liczby całkowitej, można uzyskać szereg Milli sekund od początku epoki Uniksa. Tradycyjny czas Unix to liczba sekund od epoki. Pomnożenie przez 1000 jest właściwą opcją.

+0

To ma sens. Dziękuję za wyjaśnienie. –

+3

Lub po prostu 'moment ("/Date (1377907200000)/"). ToDate(). GetTime()' –