Moje obiekty daty w JavaScript są zawsze reprezentowane przez UTC +2 ze względu na to, gdzie się znajduję. Stąd tak
Mon Sep 28 10:00:00 UTC+0200 2009
Problem polega na tym, że dokonujesz JSON.stringify
konwersji powyższej daty na
2009-09-28T08:00:00Z (notice 2 hours missing i.e. 8 instead of 10)
To, czego potrzebuję, to uszanowanie daty i godziny, ale tak nie jest, więc powinno
2009-09-28T10:00:00Z (this is how it should be)
Zasadniczo używam tego:
var jsonData = JSON.stringify(jsonObject);
Próbowałem przekazać parametr zastępczy (drugi parametr w stringify), ale problem polega na tym, że wartość została już przetworzona.
Próbowałem też użyć obiektu daty toString()
i toUTCString()
na nim, ale te też nie dają mi tego, czego chcę.
Czy ktoś może mi pomóc?
javascript
json
datetime
utc
Mark Smith
źródło
źródło
2009-09-28T10:00:00Z
nie przedstawia tego samego momentu w czasie coMon Sep 28 10:00:00 UTC+0200 2009
. DataZ
według ISO 8601 oznacza UTC, a godzina 10 w UTC to inny moment w czasie do godziny 10 w +0200. To jedno, gdyby data była serializowana z odpowiednią strefą czasową, ale prosisz nas o pomoc w serializacji do reprezentacji, która jest jednoznacznie, obiektywnie błędna .Odpowiedzi:
Ostatnio napotkałem ten sam problem. I został rozwiązany za pomocą następującego kodu:
źródło
JSON używa
Date.prototype.toISOString
funkcji, która nie reprezentuje czasu lokalnego - reprezentuje czas w niezmodyfikowanym UTC - jeśli spojrzysz na dane wyjściowe, zobaczysz, że jesteś w UTC + 2 godziny, dlatego ciąg JSON zmienia się o dwie godziny, ale jeśli pozwala to na prawidłowe przedstawienie tego samego czasu w wielu strefach czasowych.źródło
Dla przypomnienia, pamiętaj, że ostatnie „Z” w „2009-09-28T08: 00: 00Z” oznacza, że czas rzeczywiście jest podany w UTC.
Szczegółowe informacje można znaleźć pod adresem http://en.wikipedia.org/wiki/ISO_8601 .
źródło
Oto inna odpowiedź (i osobiście uważam, że jest bardziej odpowiednia)
źródło
date.toJSON () wypisuje datę UTC do formatu String (więc dodaje do niej przesunięcie, gdy konwertuje ją na format JSON).
źródło
date.getTime()
zwraca czas w milisekundach, więc powinniśmy również przekonwertować drugi operand na milisekundy. Ponieważdate.getTimezoneOffset()
zwraca przesunięcie w minutach, mnożymy to 60000, ponieważ 1 minuta = 60000 milisekund. Więc odejmując przesunięcie od aktualnego czasu otrzymujemy czas w UTC.możesz użyć momentu.js do formatowania według czasu lokalnego:
źródło
Trochę się spóźniłem, ale zawsze możesz nadpisać funkcję toJson w przypadku Date używając Prototype w następujący sposób:
W moim przypadku Util.getDateTimeString (this) zwraca ciąg podobny do następującego: „2017-01-19T00: 00: 00Z”
źródło
Gotowe rozwiązanie wymuszające
JSON.stringify
ignorowanie stref czasowych:Korzystanie z bibliotek stref czasowych typu moment + moment:
źródło
Zwykle chcesz, aby daty były prezentowane każdemu użytkownikowi w jego własnym czasie lokalnym.
dlatego używamy GMT (UTC).
Użyj Date.parse (jsondatestring), aby uzyskać lokalny ciąg czasu,
chyba że chcesz Twój czas lokalny był pokazywany każdemu odwiedzającemu.
W takim przypadku użyj metody Anatolija.
źródło
Aby obejść ten problem, użyj
moment.js
biblioteki (wersja bez strefy czasowej).Korzystałem z
flatpickr.min.js
biblioteki. Czas wynikowego utworzonego obiektu JSON jest zgodny z podanym czasem lokalnym, ale z selektorem dat.źródło
Wpadam na to trochę pracując ze starszymi rzeczami, gdzie działają tylko na wschodnim wybrzeżu USA i nie przechowują dat w UTC, wszystko to jest EST. Muszę filtrować daty na podstawie danych wprowadzonych przez użytkownika w przeglądarce, więc muszę przekazać datę w czasie lokalnym w formacie JSON.
Żeby rozwinąć to rozwiązanie już zamieszczone - oto czego używam:
Rozumiem więc, że to odejmie czas (w milisekundach (stąd 60000) od daty początkowej na podstawie przesunięcia strefy czasowej (zwraca minuty) - w oczekiwaniu na dodanie czasu do JSON () ma zamiar dodać.
źródło
Oto coś naprawdę schludnego i prostego (przynajmniej tak mi się wydaje :)) i nie wymaga manipulacji datą w celu sklonowania lub przeładowania jakichkolwiek natywnych funkcji przeglądarki, takich jak toJSON (odniesienie: How to JSON stringify a javascript Date and keep timezone , court's Shawson)
Przekaż funkcję zamiennika do JSON.stringify, która ciągnie rzeczy do zawartości twojego serca !!! W ten sposób nie musisz robić różnic godzinowych i minutowych ani żadnych innych manipulacji.
Umieściłem w console.logs, aby zobaczyć wyniki pośrednie, aby było jasne, co się dzieje i jak działa rekurencja. To ujawnia coś godnego uwagi: parametr wartości zamiennika jest już przekonwertowany na format daty ISO :). Użyj tego [klawisza], aby pracować z oryginalnymi danymi.
źródło
JavaScript normalnie konwertuje lokalną strefę czasową na UTC.
źródło
Wszystko sprowadza się do tego, czy twój serwer jest niezależny od strefy czasowej, czy nie. Jeśli tak nie jest, musisz założyć, że strefa czasowa serwera jest taka sama jak klienta lub przesłać informacje o strefie czasowej klienta i uwzględnić to również w obliczeniach.
przykład oparty na bazie PostgreSQL:
Ostatni z nich jest prawdopodobnie tym, czego chcesz użyć w bazie danych, jeśli nie chcesz poprawnie zaimplementować logiki strefy czasowej.
źródło
Zamiast tego
toJSON
możesz użyć funkcji formatowania, która zawsze podaje poprawną datę i godzinę +GMT
źródło
Próbowałem tego w kątowej 8:
utwórz Model:
w swoim komponencie
wyślij datę do swojego API w celu zapisania
Podczas ładowania danych z API zrobisz to:
model.YourDate = new Date(model.YourDate+"Z");
otrzymasz datę poprawnie ze strefą czasową.
źródło