Chciałbym uzyskać obiekt Date, który jest 30 minut później niż inny obiekt Date. Jak to zrobić za pomocą JavaScript?
javascript
date
date-manipulation
Morgan Cheng
źródło
źródło
date.setMinutes(date.getMinutes() + ...)
nie przekroczą granic czasu letniego. Na przykład (zakładając, że „2014-03-09” jest granicą czasu letniego):var d = new Date('2014-03-09 01:59:00'), f = new Date(d.getTime()); d.setMinutes(d.getMinutes() + 30);
d
jest teraz 30 minut wcześniej, nie później niżf
.f
id
zobaczysz jeden mówi „GMT-0500” drugi mówi „GMT-0400” (lub cokolwiek jest strefa czasowa). Ponadto, jeśli włączysz.getTime()
obaf
id
, zobaczysz, żef
jest większy niżd
(tj. Później).01:89
stałby się02:29
, co nie istnieje w dniu, w którym „skaczesz do przodu”. Chrome decyduje, że tak powinno być01:29
, decyduje FF03:29
. W nocy, gdy „cofniesz się”, obie przeglądarki pomijają godzinę „cofania się” i przeskakują o 90 minut do przodu02:29
. Oto kilka wersji demonstracyjnych JSFiddle: „spring forward” / „fall back”Odpowiedzi:
Korzystanie z biblioteki
Jeśli wykonujesz dużo pracy związanej z datami, możesz zajrzeć do bibliotek dat JavaScript, takich jak Datejs lub Moment.js . Na przykład w przypadku Moment.js jest to po prostu:
Waniliowy Javascript
To odpowiedź chaosu , ale w jednym wierszu:
Gdzie
diff
jest różnica w minutach, którą chcesz odoldDateObj
czasu. Może być nawet negatywny.Lub jako funkcja wielokrotnego użytku, jeśli musisz to zrobić w wielu miejscach:
I na wypadek, gdyby nie było to oczywiste, mnożymy minuty przez
60000
konwersję minut na milisekundy.Uważaj na Vanilla Javascript. Daty są trudne!
Możesz pomyśleć, że możesz dodać 24 godziny do daty, aby uzyskać jutrzejszą datę, prawda? Źle!
Okazuje się, że jeśli użytkownik zauważy czas letni, dzień niekoniecznie musi trwać 24 godziny. Jest jeden dzień w roku, który ma tylko 23 godziny, i jeden dzień w roku, który ma 25 godzin. Na przykład w większości Stanów Zjednoczonych i Kanady, 24 godziny po północy, 2 listopada 2014 r., Wciąż jest 2 listopada:
Dlatego korzystanie z jednej z wyżej wymienionych bibliotek jest bezpieczniejszym wyborem, jeśli musisz dużo z tym zrobić.
Poniżej znajduje się bardziej ogólna wersja tej funkcji, którą napisałem. Nadal polecam korzystanie z biblioteki, ale może to być przesada / niemożliwe dla twojego projektu. Składnia jest modelowana na podstawie funkcji MySQL DATE_ADD .
Działające demo jsFiddle .
źródło
źródło
Date
obiektów.var d = new Date(); d.setMinutes(d.getMinutes() + 30);
źródło
setTime
zwraca numeryczny milisekundowy znacznik czasu, a nie obiekt daty. (Nie sądzę, że możesz zrobić jedno-linijkę.)var in30Mins = new Date(+new Date() + 1.8e6)
jest jedno-liniowy, ale nie jestem pewien, czy jest lepszy niż dwuwarstwowy. ;-)źródło
setMinutes
zwraca znacznik czasu, alenow
pozostajeDate
obiektem, więcnow = new Date(now)
jest przestarzałyMoże coś takiego?
źródło
Date
obiektów.var d = new Date(); d.setMinutes(d.getMinutes() + 30);
If a parameter you specify is outside of the expected range, setMinutes() attempts to update the date information in the Date object accordingly.
Zawsze tworzę 7 funkcji do pracy z datą w JS: addSeconds, addMinutes, addHours, addDays, addWeeks, addMonths, addYears.
Przykład możesz zobaczyć tutaj: http://jsfiddle.net/tiagoajacobi/YHA8x/
Jak używać:
Oto funkcje:
źródło
date.addHours(3, 30)
dodać 3 godziny i 30 minut. addYears zajmie lata, miesiące i dni, addMonth zajmie miesiące i dni, addMinutes zajmie minuty, sekundy, milisekundy itp.new Date().addHours(4).addMinutes(45);
Możesz wywołać tyle, ile chcesz, ponieważ metody zwracają „this”, który jest bieżącym obiektem Date.var dt = new Date();
wtedy,dt.addMinutes(45); dt.addHours(4);
a nawet,dt.addMinutes(285);
a nawetdt.addMinutes(45).addHours(4);
wszystko będzie działać. Jeśli masz pytanie z jakimś przykładem kodu, napisz tutaj problem, chętnie Ci pomogę.Najłatwiejszym sposobem rozwiązania jest rozpoznanie, że w javascript daty są tylko liczbami. Zaczyna się
0
lub'Wed Dec 31 1969 18:00:00 GMT-0600 (CST)
. Każda1
reprezentuje milisekundę. Możesz dodawać lub odejmować milisekundy, pobierając wartość i tworząc nową datę przy użyciu tej wartości. Z tym umysłem możesz to zrobić całkiem łatwo.źródło
To, co robię, wydaje się działać całkiem dobrze:
Następnie możesz po prostu nazwać to tak:
źródło
return new Date(this.getTime() + minutes * 60000);
, że tymczasowy skopiowany Data nie jest konieczna. ;-)Oto wersja ES6 :
Nazwij to tak:
źródło
Wydaje mi się, że w wielu odpowiedziach brakuje kreatywnego elementu, który jest bardzo potrzebny do obliczeń w czasie. Przedstawiam swoje rozwiązanie na czasowe tłumaczenie trwające 30 minut.
( tutaj jsfiddle )
źródło
Dla leniwych jak ja:
Odpowiedź Kipa (z góry) w skrypcie coffeescript, wykorzystująca „wyliczenie” i działająca na tym samym obiekcie:
źródło
Użyj istniejącej biblioteki znanej z obsługi dziwactw związanych z obliczeniami czasu. Moim ulubionym jest moment.js .
źródło
Kolejna opcja, którą napisałem:
Biblioteka DP_DateExtensions
To przesada, jeśli to wszystko, czego potrzebujesz do przetwarzania daty, ale zrobi to, co chcesz.
Obsługuje formatowanie daty / godziny, matematykę dat (dodawanie / odejmowanie części daty), porównywanie dat, parsowanie dat itp. Jest to dowolnie otwarte źródło.
źródło
Możesz to zrobić:
źródło
Oto moja jedna linijka:
źródło
Powinieneś uzyskać wartość bieżącej daty, aby uzyskać datę za pomocą (ms) i dodać (30 * 60 * 1000) do niej. Teraz masz (aktualna data + 30 min) z ms
źródło
Wiem, że temat jest zdecydowanie za stary. Ale jestem całkiem pewien, że są tacy programiści, którzy nadal tego potrzebują, więc stworzyłem ten prosty skrypt dla Ciebie. Mam nadzieję, że ci się spodoba!
źródło