Uzyskaj różnicę czasu między dwiema datami w kilka sekund

149

Próbuję znaleźć różnicę między dwiema datami w ciągu kilku sekund. Logika byłaby następująca:

  • ustal początkową datę, która będzie teraz;
  • ustal ostateczną datę, która będzie datą początkową plus kilka sekund w przyszłości (powiedzmy na przykład 15)
  • uzyskać różnicę między tymi dwoma (liczba sekund)

Powodem, dla którego robię to z datami, jest to, że ostateczna data / czas zależy od innych zmiennych i nigdy nie jest taka sama (zależy to od tego, jak szybko użytkownik coś robi), a także przechowuję datę początkową dla innych rzeczy.

Próbowałem czegoś takiego:

var _initial = new Date(),
    _initial = _initial.setDate(_initial.getDate()),
    _final = new Date(_initial);
    _final = _final.setDate(_final.getDate() + 15 / 1000 * 60);

var dif = Math.round((_final - _initial) / (1000 * 60));

Rzecz w tym, że nigdy nie dostaję właściwej różnicy. Próbowałem podzielić, przez 24 * 60które zostawiłoby mi sekundy, ale nigdy nie udawało mi się. Więc co jest nie tak z moją logiką? Mogę popełnić jakiś głupi błąd, bo jest już dość późno, ale przeszkadza mi, że nie mogę zmusić go do pracy :)

Roland
źródło
2
Kolejność operacji jest kluczowa.
Dylan Cross
1
Więc chcesz mieć znacznik czasu, dodaj 15 sekund, a następnie zobacz, jaka jest różnica w sekundach. Powiedziałbym, że są duże szanse, że różnica będzie… czekać… 15 sekund?
adeneo
Zobacz też: stackoverflow.com/questions/13893754
Tomasz Nurkiewicz,
1
Naprawdę rozumiem, co próbujesz zrobić (tak mi się wydaje), ale jeśli weźmiesz nową datę (), która jest teraz czasem unixa, dodaj 15 sekund i od razu sprawdź różnicę, różnica będzie wynosić 15 sekund (bez milisekund potrzebnych do obliczenia), ale zgaduję, że Twoim zamiarem jest jakoś porównać to w przyszłości.
adeneo
1
Naprawdę nie rozumiem, aby udowodnić swój punkt widzenia, oto działająca FIDDLE dla twojego powyższego przykładu. Jeśli próbujesz dowiedzieć się, ile czasu zajęło użytkownikowi wykonanie jakiejś czynności, zwykle uzyskujesz sygnaturę czasową, gdy użytkownik rozpoczyna operację, i sygnaturę czasową, gdy użytkownik zakończył operację, i porównujesz je, i wiesz, ile czasu to zajęło . Po co, do cholery, te 15 sekund?
adeneo

Odpowiedzi:

283

Kod

var startDate = new Date();
// Do your operations
var endDate   = new Date();
var seconds = (endDate.getTime() - startDate.getTime()) / 1000;

Lub nawet prostsze, (endDate - startDate) / 1000jak wskazano w komentarzach, chyba że używasz maszynopisu.


Wyjaśnienie

Musisz wywołać getTime()metodę dla Dateobiektów, a następnie po prostu odjąć je i podzielić przez 1000 (ponieważ pierwotnie jest to w milisekundach). Dodatkowo, kiedy wywołujesz getDate()metodę, w rzeczywistości otrzymujesz dzień miesiąca jako liczbę całkowitą od 1 do 31 (nie licząc od zera), w przeciwieństwie do czasu epoki, który otrzymasz od wywołania getTime()metody, reprezentująca liczbę milisekund od 1 stycznia 1970, 00:00


Tyrada

W zależności od tego, jakie są Twoje operacje związane z datą, możesz zainwestować w integrację biblioteki, takiej jak date.js lub moment.js, która znacznie ułatwia pracę programistom, ale to tylko kwestia osobistych preferencji.

Na przykład w moment.js zrobilibyśmy, moment1.diff(moment2, "seconds")co jest piękne.


Przydatne dokumenty dotyczące tej odpowiedzi

Juan Cortés
źródło
14
Nie ma potrzeby getTIme , daty mogą być od siebie odejmowane, ponieważ operator - wymusi je na liczbach.
RobG
3
getTime jest konieczne, jeśli używasz maszynopis niej nie pozwala operację arytmetyczną między pierwiastka innego niż każdy, numer lub enum
zaffaste
Możesz użyć .valueOf(), co -w każdym razie nazwałby operator ...
Heretic Monkey
1
co powiesz na to, że potrzebujemy również różnic w czasie godzin / minut ...? Powinienem podzielić to przez 60 czy wielokrotność ...? @Juan
gumuruh
Dodaj nowe wątpliwości jako indywidualne pytania, ale ponieważ to prawdopodobnie zostanie zamknięte jako duplikat, zajrzyj tutaj stackoverflow.com/questions/1322732/ ...
Juan Cortés
5

Możesz użyć new Date().getTime()do uzyskania sygnatur czasowych. Następnie można obliczyć różnicę między końcem i zacząć wreszcie przekształcić znacznik czasu, który jest mspod s.

const start = new Date().getTime();
const end = new Date().getTime();

const diff = end - start;
const seconds = Math.floor(diff / 1000 % 60);
Gruzińsko-Sorin Maxim
źródło
4
<script type="text/javascript">
var _initial = '2015-05-21T10:17:28.593Z';
var fromTime = new Date(_initial);
var toTime = new Date();

var differenceTravel = toTime.getTime() - fromTime.getTime();
var seconds = Math.floor((differenceTravel) / (1000));
document.write('+ seconds +');
</script>
Abdulrahman A Alkhodairi
źródło
1

Poniższy kod poda różnicę czasu w sekundach.

var date1 = new Date(); // current date
var date2 = new Date("06/26/2018"); // mm/dd/yyyy format
var timeDiff = Math.abs(date2.getTime() - date1.getTime()); // in miliseconds
var timeDiffInSecond = Math.ceil(timeDiff / 1000); // in second

alert(timeDiffInSecond );
Gautam Rai
źródło
0

spróbuj użyć dedykowanych funkcji z języków programowania wysokiego poziomu. JavaScript .getSeconds();pasuje tutaj:

var specifiedTime = new Date("November 02, 2017 06:00:00");
var specifiedTimeSeconds = specifiedTime.getSeconds(); 

var currentTime = new Date();
var currentTimeSeconds = currentTime.getSeconds(); 

alert(specifiedTimeSeconds-currentTimeSeconds);
Gilbert Cut
źródło
0

różnica czasu między teraz a 10 minutami później przy użyciu momentjs

let start_time = moment().format('YYYY-MM-DD HH:mm:ss');
let next_time = moment().add(10, 'm').format('YYYY-MM-DD HH:mm:ss');

let diff_milliseconds = Date.parse(next_time) - Date.parse(star_time);
let diff_seconds = diff_milliseconds * 1000;
Surya Singh
źródło