2012-07-15 16 views
22

Próbuję obliczyć różnicę między dwoma razy przy użyciu JavaScript. To tylko podstawowa matematyka, ale wydaje mi się, że mam z tym kilka problemów podczas korzystania z JSON.stringify() i JSON.parse().Problemy z datą() podczas korzystania z JSON.stringify() i JSON.parse()

Jeśli zastanawiasz się, dlaczego ja stosując funkcję JSON.stringify() do tej pory, to dlatego, że za pomocą lokalnej pamięci do przechowywania niektórych danych po stronie klienta i używać go, gdy ziemie klienta na mojej stronie ponownie (to szybciej w ten sposób zamiast składać więcej żądań na serwer). Te dane zwykle aktualizują się od czasu do czasu (przechwytuję dane za pośrednictwem interfejsu API z innej witryny), więc ustawiłem zmienną data_update i przechowuję ją razem z innymi danymi.

W ten sposób pobieram przechowywane dane z lokalnego magazynu i sprawdzam, czy różnica między data_update (która jest datą/czasem), a czasem/datą, kiedy to sprawdzenie jest sprawdzane i czy jest większa niż tydzień/dzień/itd.

Jest to powód, dla którego używam funkcji JSON. Mój problem polega na tym, że kiedy parsuję dane z lokalnego magazynu, data wydaje się być inna niż obiekt Date().

Próbuję zrobić następną operację za powiedzieć:

var x = JSON.parse(JSON.stringify(new Date())); 

var y = JSON.parse(this.get_local_storage_data(this.data_cache_key)); // the data object stored on local storage 

var q = y.data_update; // this is the variable where the Date() was stored 

console.log(Math.floor((x-q)/1000)); 

Powyższy powróci null. Także gdy chcę zobaczyć wynik Math.floor(x), ponownie zwraca null.

Co mogę zrobić w tej sytuacji? Czy jest na to poprawka?

+0

Można uniknąć aggro tak przez używając wrapperu localStorage jak rhaboo zamiast stringify/pars, które oprócz tego mają wiele innych niedokładności. –

Odpowiedz

43

Jeśli spojrzeć na wyjściu JSON.stringify na randkę, zobaczysz, że:

JSON.stringify(new Date()) 

rezultaty w formie łańcucha. JSON nie ma prymitywnej reprezentacji obiektów Date, które JSON.parse automatycznie zamieni z powrotem w obiekt Date. konstruktor

datę obiektu może podjąć datę ciąg, więc można włączyć te wartości ciągów powrotem do dat wykonując:

var x = new Date(JSON.parse(JSON.stringify(new Date()))); 

Następnie arytmetyka będzie działać.

x = new Date(JSON.parse(JSON.stringify(new Date()))) 
y = new Date(JSON.parse(JSON.stringify(new Date()))) 
y - x 
=> 982 
15
JSON.stringify(new Date()) 

powraca

"2013-10-06T15: 32: 18.605Z"

Dzięki Bogu jest: Date.toISOString()

+0

Dobrze wiedzieć, że 'JSON.stringify()' używa 'Date.toISOString()' za kulisami. Dzięki temu mój kod był bardziej przejrzysty. –

Powiązane problemy