Załóżmy, że użytkownik Twojej witryny wprowadza zakres dat.
2009-1-1 to 2009-1-3
Musisz wysłać tę datę do serwera w celu przetworzenia, ale serwer oczekuje, że wszystkie daty i godziny będą w UTC.
Załóżmy teraz, że użytkownik jest na Alasce, Hawajach lub Fidżi. Ponieważ znajdują się w strefie czasowej zupełnie innej niż UTC, zakres dat należy przekonwertować na coś takiego:
2009-1-1T8:00:00 to 2009-1-4T7:59:59
Używając obiektu JavaScript Date, w jaki sposób przekonwertowałbyś pierwszy „zlokalizowany” zakres dat na coś, co serwer zrozumie?
javascript
date
utc
dthrasher
źródło
źródło
Odpowiedzi:
Źródło: Dokumenty internetowe MDN
Potrzebny format jest tworzony za pomocą
.toISOString()
metody. W przypadku starszych przeglądarek (tj. 8 i starszych), które nie obsługują natywnie tej metody, podkładkę można znaleźć tutaj :To da ci możliwość robienia tego, czego potrzebujesz:
Strefa czasowa moment.js i moment.js są naprawdę nieocenionymi narzędziami ... szczególnie do nawigacji w strefach czasowych między javascript klienta i serwera.
źródło
toISOString
poprawnie konwertuje na UTC.[toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offset
Również w tym przykładzie pokazują, że offset jest uwzględniany, gdy wywoływane jest toISOStringProsty i głupi
źródło
function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
new Date(new Date().toUTCString().substr(0, 25))
now.toUTCSTring()
zamiast (źle)now_utc.toString()
.Oto moja metoda:
Wynikowy
utc
obiekt nie jest tak naprawdę datą UTC, ale lokalną datą przesuniętą tak, by pasowała do godziny UTC (patrz komentarze). Jednak w praktyce spełnia swoje zadanie.źródło
Date.now()
daje on czas lokalny, a nie czas UTC, i to rozwiązanie wydaje mi się najprostsze. Przynajmniej w moim przypadku, gdy chcę czasu UNIX, a nie ładnie sformatowanego ciągu. (jedyną różnicą było to, że pomnożyłem,60 * 1000
żeby być wyjątkowo wyraźnym :))now.toString()
zutc.toString()
: nie ma zmiany strefy czasowej, ale zmiana czasu, co jest zupełnie inną rzeczą. Jednak czystsze rozwiązanie byłoby znacznie bardziej złożone (tak mi się wydaje), a ten kod wykonuje pracę w zdecydowanej większości przypadków, o ile nie zajmujemy się dalej strefami czasowymi. Przypomniało mi to o dziurkowaniu kaczek : inna rzecz, ale zachowana tak samo. Zauważ też, że kod DrunkCoder ma ten sam problem.źródło
Konwertuj na ISO bez zmiany daty / godziny
Konwertuj na ISO ze zmianą daty / godziny (data / godzina zostanie zmieniona)
Link do skrzypiec
źródło
Przeglądarki mogą się różnić i należy również pamiętać, aby nie ufać żadnym informacjom generowanym przez klienta, co powiedziawszy, poniższe oświadczenie działa dla mnie (Google Chrome v24 na Mac OS X 10.8.2)
var utcDate = new Date(new Date().getTime());
edycja: „Czym to się różni od zwykłego
new Date()
?” patrz tutaj: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateDodanie 60000 * Date.getTimezoneOffset (), jak stwierdzono w poprzednich odpowiedziach, jest niepoprawne. Po pierwsze, musisz traktować wszystkie Daty / Czasy jako już UTC z modyfikatorem strefy czasowej do celów wyświetlania.
Ponownie, przeglądarki mogą się różnić, jednak Date.getTime () zwraca liczbę milisekund od 1970-01-01 UTC / GMT. Jeśli utworzysz nową datę przy użyciu tego numeru, tak jak ja powyżej, będzie to UTC / GMT. Jeśli jednak wyświetlisz go, wywołując metodę .toString (), pojawi się ona w lokalnej strefie czasowej, ponieważ .toString () używa lokalnej strefy czasowej, a nie strefy czasowej obiektu Date, do którego została wywołana.
Odkryłem również, że jeśli wywołasz funkcję .getTimezoneOffset () w określonym dniu, zwróci ona lokalną strefę czasową, a nie strefę czasową obiektu daty, w którym ją wywołałeś (nie mogę jednak zweryfikować, czy jest to standard).
W mojej przeglądarce dodanie 60000 * Date.getTimezoneOffset () tworzy DateTime, który nie jest UTC . Jednak wyświetlany w mojej przeglądarce (np. .ToString ()) wyświetla DateTime w mojej lokalnej strefie czasowej, która byłaby poprawna dla czasu UTC, gdyby informacje o strefie czasowej były ignorowane.
źródło
new Date()
, ani znacznik czasu, ani strefa czasowa nie ulegają zmianienew Date().getTime()
zawsze zwraca znacznik czasu, który jest niezależny od strefy czasowej. Nie jest z nim powiązany żaden znacznik czasu, dopóki nie spróbujesz sformatować go w liczbie innej niż liczba milisekund od epoki Uniksa.new Date(new Date().getTime())
zwraca dokładnie taką samą wartość jaknew Date()
. Czy możesz wyjaśnić, w jakim sensie twoja odpowiedź ma wyraźną wartośćnew Date()
?new Date("5/19/2014").getTime()
. Konstruktor daty utworzył datę z przesunięciem +7. Na serwerze (C #) dodaję wartość księgową jako milisekundy do epoki uniksowejnew DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1401087600000)
. Rezultatem jest5/19/2014 7:00:00 AM
. Wydaje się więc, że getTime () podaje liczbę milisekund, w tym moje przesunięcie UTC.new Date(new Date().getTime())
to nie działa. Mogę potwierdzić, żenew Date(Date.UTC(2019, 8, 27, 0, 0, 0))
rzeczywiście generuje czas UTC. Jeśli nie użyjeszDate.UTC(...)
, w strefie czasowej pojawią się daty z przesunięciem UTC.źródło
Inne rozwiązanie do konwersji na UTC i zachowania go jako obiektu daty: (Działa poprzez usunięcie części „GMT” z końca sformatowanego ciągu, a następnie ponowne umieszczenie jej w konstruktorze daty)
Musiałem to zrobić, aby połączyć się z biblioteką wyboru daty i godziny. Ogólnie jednak praca z datami w ten sposób jest złym pomysłem.
Użytkownicy zazwyczaj chcą pracować z czasem danych w czasie lokalnym, więc albo zaktualizuj kod po stronie serwera, aby poprawnie przeanalizować ciągi datetime z przesunięciami, a następnie przekonwertuj na UTC (najlepsza opcja) lub przekonwertuj na ciąg znaków UTC po stronie klienta przed wysłaniem do serwer (jak w odpowiedzi Willa Sterna)
źródło
Czy próbujesz przekonwertować datę na taki ciąg?
Zrobiłbym funkcję, aby to zrobić, i chociaż jest to nieco kontrowersyjne, dodaj go do prototypu Date. Jeśli nie czujesz się komfortowo, możesz to ustawić jako samodzielną funkcję, przekazując datę jako parametr.
Jeśli potrzebujesz go w czasie UTC, po prostu zamień wszystkie funkcje get * na getUTC *, np .: getUTCFullYear, getUTCMonth, getUTCHours ... a następnie po prostu dodaj „+00: 00” na końcu zamiast przesunięcia strefy czasowej użytkownika.
źródło
String(temp)
ponieważ inny sposób ("" + temp
) jest zgłaszane jako błąd JSLint te dni.toISOString
metodapowinien działać w większości nowszych przeglądarek. powraca
2012-07-28T00:00:00.000Z
w przeglądarce Firefox 6.0źródło
Moje zalecenie podczas pracy z datami to parsowanie daty w poszczególnych polach na podstawie danych wprowadzonych przez użytkownika. Możesz użyć go jako pełnego ciągu, ale bawisz się ogniem.
JavaScript może różnie traktować dwie równe daty w różnych formatach.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse
Nigdy nie rób czegoś takiego jak:
Po przeanalizowaniu daty w poszczególnych polach na podstawie danych wprowadzonych przez użytkownika, utwórz obiekt daty. Po utworzeniu obiektu daty przekonwertuj go na UTC, dodając przesunięcie strefy czasowej. Nie mogę podkreślić, jak ważne jest użycie przesunięcia względem obiektu daty ze względu na czas letni (to kolejna dyskusja pokazująca dlaczego).
Teraz możesz przekazać datę do serwera w czasie UTC. Ponownie odradzam używanie jakichkolwiek ciągów dat. Przekaż go do serwera w podziale na najmniejszą szczegółowość, jakiej potrzebujesz, np. Rok, miesiąc, dzień, minutę lub jako wartość taką jak milisekundy z epoki unixu.
źródło
Jeśli często masz do czynienia z datami, warto skorzystać z moment.js ( http://momentjs.com ). Metodą konwersji na UTC byłoby:
Możesz użyć formatu, aby zmienić datę na dowolny, jaki chcesz:
Dostępne są również opcje przesunięcia, ale istnieje dodatkowa biblioteka uzupełniająca do obsługi strefy czasowej ( http://momentjs.com/timezone/ ). Konwersja czasu byłaby tak prosta:
źródło
moment(yourTime).utc()
imoment.utc(yourTime)
? Zwykle używam tego drugiego.Moje rozwiązanie utrzymuje tę samą datę bez względu na strefę czasową ustawioną po stronie klienta. Może ktoś uzna to za przydatne.
Mój przypadek użycia:
Tworzę aplikację do zrobienia, w której ustawiasz datę swojego zadania. Ta data powinna pozostać stała bez względu na strefę czasową, w której się znajdujesz.
Przykład. Chcesz zadzwonić do przyjaciela o 8 rano 25 czerwca.
Utworzysz to zadanie 5 dni przed (20 czerwca) podczas pobytu w Chinach.
Następnie tego samego dnia lecisz na kilka dni do Nowego Jorku.
Następnie, 25 czerwca, gdy jesteś jeszcze w Nowym Jorku, budzisz się o 7:30 rano (co oznacza, że powinieneś otrzymać powiadomienie o zadaniu za 30 minut (nawet o 13:30 już w Chinach, gdzie byłeś podczas tworzenia zadanie)
Zadanie polega więc na ignorowaniu strefy czasowej. Oznacza to: „Chcę to zrobić o 8 rano w dowolnej strefie czasowej, w której będę”.
To, co robię, to powiedzmy: „Zakładam, że zawsze jesteś w strefie czasowej Londynu - UTC”.
Oznacza to, że - gdy użytkownik wybierze datę w swojej Strefie czasowej - przekonwertuję tę datę na tę samą datę w UTC. to znaczy. Wybierasz 8 rano w Chinach, ale przeliczam go na 8 rano w UTC.
Następnie - następnym razem, gdy otworzysz aplikację - odczytam datę zapisaną w UTC i przekonwertuję ją na tę samą datę w twojej bieżącej strefie czasowej - np. Konwertuję 8 rano w UTC na 8 rano w strefie czasowej Nowego Jorku.
To rozwiązanie oznacza, że data może oznaczać coś innego, w zależności od tego, gdzie jesteś podczas ustawiania i gdzie ją czytasz, ale pozostaje stała w taki sposób, że „czuje się”, jakbyś zawsze był w tej samej strefie czasowej.
Napiszmy kod:
Po pierwsze - mamy 2 główne funkcje do konwersji z / na UTC ignorujące strefę czasową:
Następnie zapisuję / czytam tę datę jak:
źródło
Właśnie odkryłem, że date.format.js Stevena Levithana w wersji 1.2.3 robi dokładnie to, czego chcę. Pozwala podać ciąg formatu dla daty JavaScript i zostanie przekonwertowany z czasu lokalnego na UTC. Oto kod, którego teraz używam:
źródło
Odkryłem, że parsowanie daty wtyczki jQuery Globalization działa najlepiej. Inne metody miały problemy z przeglądarkami i rzeczy takie jak date.js nie były aktualizowane od dłuższego czasu.
Nie potrzebujesz także datePicker na stronie. Możesz po prostu wywołać coś podobnego do przykładu podanego w dokumentacji:
źródło
Ta funkcja działa dla mnie pięknie.
źródło
Korzystanie z metody UTC moment.js ;
źródło
To da ci właściwą datę i godzinę UTC.
To dlatego, że
getTimezoneOffset()
da ci różnicę stref czasowych w minutach. Zalecam, aby nie używać,toISOString()
ponieważ dane wyjściowe będą w postaci ciągu. Dlatego w przyszłości nie będzie można manipulować datąźródło
Oto co zrobiłem w przeszłości:
źródło
Jeśli potrzebujesz Date Object
Przekazywanie tylko ciągu daty Data zakłada, że czas będzie przesunięty o 00:00 według strefy czasowej:
Jeśli dodasz bieżące godziny i minuty, otrzymasz odpowiednią datę:
źródło
Patrząc na twoje pytanie, jasne jest, że po prostu chcesz wysłać zakres dat do swojego zaplecza w celu dalszego przetwarzania.
Zakładam, że przestrzegasz standardowych wytycznych dotyczących danych, które oczekują, że dane będą miały określony format. Na przykład używam ODATA, która jest interfejsem API RESTfull, który oczekuje, że obiekty daty i godziny mają format: -
Można to łatwo osiągnąć za pomocą zamieszczonego poniżej fragmentu kodu (zmień format zgodnie z wymaganiami).
var mydate;//assuming this is my date object which I want to expose var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";
Z drugiej strony jesteś w mojej sytuacji, w której otrzymałeś datę z backendu, a przeglądarka przekształca ją w lokalną datę. Z drugiej strony jesteś zainteresowany datą UTC, a następnie możesz wykonać następujące czynności:
var mydate;//assuming this is my date object which I want to expose var UTCDate = new Date(mydate);/*create a copy of your date object. Only needed if you for some reason need the original local date*/ UTCDate.setTime(UTCDate.getTime() + UTCDate.getTimezoneOffset() * 60 * 1000);
Fragment kodu powyżej zasadniczo dodaje / odejmuje czas dodawany / odejmowany przez przeglądarkę na podstawie strefy czasowej.
Na przykład, jeśli jestem w EST (GMT-5), a moja usługa zwraca obiekt daty / godziny = Śr 17 sierpnia 2016 00:00:00 GMT-0500 moja przeglądarka automatycznie odejmuje przesunięcie strefy czasowej (5 godzin), aby uzyskać mój czas lokalny. Więc jeśli spróbuję pobrać czas, dostanę Śr 16 sierpnia 2016 19:00:00 GMT-0500. To powoduje wiele problemów. Istnieje wiele bibliotek, które na pewno to ułatwią, ale chciałem podzielić się czystym podejściem JS.
Aby uzyskać więcej informacji, proszę spojrzeć na: http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/ gdzie mam Inspiracja.
Mam nadzieję że to pomoże!
źródło
Ta metoda da ci:
2017-08-04T11:15:00.000+04:30
i możesz zignorować zmienną strefy , aby po prostu ją zdobyć2017-08-04T11:15:00.000
.źródło
Korzystając z pakietu moment, możesz łatwo przekonwertować ciąg dat UTC na nowy obiekt Date:
Jest to szczególnie pomocne, gdy twój serwer nie obsługuje strefy czasowej i chcesz przechowywać datę UTC zawsze na serwerze i odzyskać ją jako nowy obiekt Date. Powyższy kod działał dla mojego wymagania podobnego problemu, dla którego przeznaczony jest ten wątek. Udostępnianie tutaj, aby pomóc innym. W żadnej odpowiedzi nie widzę dokładnie powyższego rozwiązania. Dzięki.
źródło
const event = new Date ();
console.log (event.toUTCString ());
źródło
Wiem, że to pytanie jest stare, ale analizowałem ten sam problem, a jedną z opcji byłoby zamiast tego wysłanie date.valueOf () na serwer. funkcja valueOf () javascript Date wysyła liczbę milisekund od północy 1 stycznia 1970 UTC.
wartość()
źródło
Tak właśnie musiałem to zrobić, ponieważ nadal chciałem, aby obiekt daty JavaScript był zmanipulowany jako data i niestety wiele z tych odpowiedzi wymaga przejścia do ciągu znaków.
źródło
przędza dodaje chwili
źródło
Jeszcze prostsze
źródło
setTime
polega nanew Date
czymś, czego nie obejmujesz. Proszę uzupełnić odpowiedź.