Mam stronę internetową z trzema listami rozwijanymi dla dnia, miesiąca i roku. Jeśli użyję Date
konstruktora JavaScript, który pobiera liczby, to otrzymam Date
obiekt dla mojej bieżącej strefy czasowej:
new Date(xiYear, xiMonth, xiDate)
Podaj poprawną datę, ale wydaje się, że data ta to GMT + 01: 00 ze względu na czas letni.
Problem polega na tym, że następnie przekazuję to Date
do metody Ajax, a kiedy data na serwerze jest przekształcana w postaci szeregowej, jest konwertowana na GMT i tak traci godzinę, która przesuwa dzień wstecz o jedną. Teraz mógłbym tylko przekazać dzień, miesiąc i rok indywidualnie do metody Ajax, ale wydaje się, że powinien istnieć lepszy sposób.
Przyjęta odpowiedź wskazała mi właściwy kierunek, jednak setUTCHours()
zmieniło się samo użycie :
Apr 5th 00:00 GMT+01:00
do
Apr 4th 23:00 GMT+01:00
Następnie musiałem ustawić datę UTC, miesiąc i rok
Apr 5th 01:00 GMT+01:00
co chciałem.
źródło
Odpowiedzi:
korzystanie z
.setUTCHours()
niego byłoby możliwe, aby faktycznie ustawić daty w czasie UTC, co pozwoliłoby na użycie czasów UTC w całym systemie.Nie możesz jednak ustawić go za pomocą UTC w konstruktorze, chyba że podasz ciąg daty.Za pomocą
new Date(Date.UTC(year, month, day, hour, minute, second))
możesz utworzyć obiekt daty z określonego czasu UTC.źródło
Ta odpowiedź jest specjalnie dostosowana do pierwotnego pytania i nie daje odpowiedzi, której koniecznie oczekujesz. W szczególności niektóre osoby będą chciały odjąć przesunięcie strefy czasowej zamiast go dodać. Pamiętaj jednak, że sedno tego rozwiązania polega na zhakowaniu obiektu daty javascript dla określonej deserializacji, a nie we wszystkich przypadkach.
źródło
*60*1000
w tym przypadku jest to jaśniejsze; innymi słowy, jest dość oczywiste, dlaczego tam jest.Wierzę, że potrzebujemy createDateAsUTC funkcji (proszę porównać z convertDateToUTC )
źródło
date
w strefę czasową UTC, ale drugi wydaje się nie robić nic przydatnego? (zwraca tę samą datę jakdate
)Date
Obiekt JavaScript zawsze będzie odzwierciedlał epokę uniksową opartą na UTC i lokalną strefę czasową. Objaw jest widoczny, gdy wywołujesztoString
wynikowy obiekt daty i nadal widzisz lokalną strefę czasową, nawet jeśli spodziewałeś się, że jest to UTC.Date
obiektem JavaScript . Innym sposobem, aby zobaczyć to tutaj, jestDate.UTC
oczekiwanie wartości opartych na UTC, a Ty podajesz wartości czasu lokalnego i odwrotnie za pomocąDate
konstruktora.Wystarczy ustawić strefę czasową i wrócić zgodnie
źródło
Nie sądzę, aby było to możliwe - po utworzeniu nie ma możliwości ustawienia strefy czasowej dla obiektu Date.
I w pewnym sensie ma to sens - koncepcyjnie (jeśli nie we wdrażaniu); na http://en.wikipedia.org/wiki/Unix_timestamp (moje podkreślenie):
Kiedy go zbudujesz, będzie on reprezentował pewien punkt w „czasie rzeczywistym”. Strefa czasowa ma znaczenie tylko wtedy, gdy chcesz przekonwertować ten abstrakcyjny punkt czasowy na ciąg czytelny dla człowieka.
Dlatego sensowne jest, że możesz zmienić rzeczywisty czas, jaki Data reprezentuje w konstruktorze. Niestety wydaje się, że nie ma możliwości przejścia w wyraźnej strefie czasowej - a wywoływany przez ciebie konstruktor (prawdopodobnie poprawny) tłumaczy twoje „lokalne” zmienne czasowe na GMT, gdy przechowuje je kanonicznie - więc nie ma możliwości użycia
int, int, int
konstruktora do Czasy GMT.Plusem jest to, że użycie konstruktora, który pobiera ciąg znaków, jest banalne. Nie musisz nawet konwertować miesiąca liczbowego na ciąg znaków (przynajmniej w przeglądarce Firefox), więc miałem nadzieję, że naiwna implementacja zadziała. Jednak po wypróbowaniu działa z powodzeniem w Firefox, Chrome i Opera, ale kończy się niepowodzeniem w Konquerorze („Nieprawidłowa data”), Safari („Nieprawidłowa data”) i IE („NaN”). Przypuszczam, że masz po prostu tablicę odnośników do konwersji miesiąca na ciąg znaków, na przykład:
źródło
Wiem, że to stare, ale jeśli to pomoże, możesz użyć strefy czasowej chwili i chwili. Jeśli ich nie widziałeś, spójrz.
http://momentjs.com/timezone/
http://momentjs.com/
dwie naprawdę przydatne biblioteki manipulacji czasem.
źródło
Jeśli chcesz poradzić sobie z nieco innym, ale pokrewnym, problemem tworzenia obiektu JavaScript Data z roku, miesiąca, dnia, ..., w tym strefy czasowej - to znaczy, jeśli chcesz parsować ciąg znaków na datę - to najwyraźniej muszą wykonać irytująco skomplikowany taniec:
Oznacza to, że utworzysz „czas UTC”, używając daty bez strefy czasowej (więc wiesz, w jakich ustawieniach regionalnych jest UTC, a mianowicie „ustawienia regionalne UTC” i nie są one domyślnie ustawione na lokalne), a następnie ręcznie zastosujesz wskazane przesunięcie strefy czasowej.
Czy nie byłoby miło, gdyby ktoś myślał o obiekcie z datą JavaScript dłużej niż, oooh, pięć minut ...
źródło
dla wszystkich przesunięć lokalizacji Lista Wiki przesunięć czasowych UTC
źródło
getTimeZoneOffset ma wartość ujemną dla UTC + z.
źródło
Może to komuś pomóc, umieścić UTC na końcu tego, co przekazujesz nowemu konstruktorowi
Przynajmniej w chromie można powiedzieć
var date = new Date("2014-01-01 11:00:00 UTC")
źródło
+0000
(zauważyłem, że spacja między 00 a UTC musi zostać usunięta), a to zadziała zarówno w przeglądarce Firefox, jak i Chrome. Nie jestem pewien co do Safari (odniesienie: stackoverflow.com/a/17545854/1273587 )Rozwiązanie jednoliniowe
Zamiast 1422524805305 użyj znacznika czasu w milisekundach Zamiast 330, użyj przesunięcia strefy czasowej w minutach wrt. GMT (np. Indie +5: 30 to 5 * 60 + 30 = 330 minut)
źródło
źródło
Najłatwiejszym sposobem na znalezienie prawidłowej daty jest użycie datejs.
http://www.datejs.com/
Dostaję daty przez Ajax w tym formacie jako ciąg: „2016-01-12T00: 00: 00”
Konsola będzie czytać:
Pn 11 stycznia 2016 19:00:00 GMT-0500 (wschodni czas standardowy)
Wt 12 stycznia 2016 00:00:00 GMT-0500 (wschodni czas standardowy)
https://jsfiddle.net/vp1ena7b/3/
„AddMinutes” pochodzi od datejs, prawdopodobnie mógłbyś to zrobić w czystym js na własną rękę, ale miałem już datejs w moim projekcie, więc znalazłem sposób, aby użyć go, aby uzyskać prawidłowe daty.
Myślałem, że to może komuś pomóc ...
źródło
dowolny przebieg w
źródło
Ten kod zwróci obiekt Date sformatowany w strefie czasowej przeglądarki .
Edytować:
Aby uniknąć zanieczyszczenia interfejsu Data API, powyższą funkcję można przekształcić w funkcję narzędzia. Funkcja pobiera obiekt Date i zwraca zmutowany obiekt Date.
źródło
Najlepsze rozwiązanie, jakie widziałem z tego, pochodzi
http://www.codingforums.com/archive/index.php/t-19663.html
Funkcja czasu drukowania
Przykład pełnego kodu
źródło
jeśli chcesz sprawdzić różnicę w czasie między dwiema datami, możesz po prostu sprawdzić, czy druga strefa czasowa jest mniejsza lub większa od pierwszej pożądanej strefy czasowej i odjąć lub dodać godzinę.
źródło
GMT -03: 00 Przykład
Lub nawet
źródło
To zadziałało dla mnie. Nie jestem jednak pewien, czy to dobry pomysł.
źródło
Użyłem pakietu timezone-js.
źródło
To jest NAJLEPSZE rozwiązanie
Za pomocą:
Kod:
Wersja do kawy:
źródło