Pytanie Jak uzyskać znacznik czasu w JavaScript?


Jak mogę uzyskać znacznik czasu w JavaScript?

Coś podobnego do znacznika Unixa, to znaczy pojedynczej liczby reprezentującej aktualny czas i datę. Jako liczba lub ciąg.


3367
2017-10-21 09:29


pochodzenie


Jak zdobyć 64-bitowy znacznik czasu w JS? - Alexander Mills
@AlexanderMills Ponieważ JavaScript nie obsługuje 64-bitowych liczb całkowitych, musisz uzyskać dwie 32-bitowe liczby całkowite. Zadaj kolejne pytanie. - wizzwizz4


Odpowiedzi:


Short & Snazzy:

+ new Date()

Jednoargumentowy operator, jak plus wyzwala valueOf metoda w Date obiekt i zwraca znacznik czasu (bez żadnych zmian).

Detale:

W prawie wszystkich obecnych przeglądarkach możesz używać Date.now() aby uzyskać znacznik czasu UTC milisekundy; Godnym uwagi wyjątkiem jest IE8 i wcześniejsze (zob tabela zgodności).

Możesz z łatwością zrobić shim dla tego:

if (!Date.now) {
    Date.now = function() { return new Date().getTime(); }
}

Aby uzyskać znacznik czasu sekundy, możesz użyć:

Math.floor(Date.now() / 1000)

Lub alternatywnie możesz użyć:

Date.now() / 1000 | 0

Który powinien być nieco szybszy, ale także mniej czytelny (również zobacz tę odpowiedź).

Polecam używanie Date.now() (z podkładką kompatybilności). Jest nieco lepszy, ponieważ jest krótszy i nie tworzy nowego Date obiekt. Jeśli jednak nie chcesz mieć shim i maksymalnej kompatybilności, możesz użyć "starej" metody, aby uzyskać znacznik czasu milisekundy:

new Date().getTime()

Które możesz następnie przekonwertować na sekundy w ten sposób:

Math.round(new Date().getTime()/1000)

Możesz także użyć valueOf metoda, którą pokazaliśmy powyżej:

new Date().valueOf()

Znacznik czasu w milisekundach

var timeStampInMs = window.performance && window.performance.now && window.performance.timing && window.performance.timing.navigationStart ? window.performance.now() + window.performance.timing.navigationStart : Date.now();

console.log(timeStampInMs, Date.now());


4159
2017-10-21 09:32



Innym ważnym wyjątkiem jest node.js. Przyszedłem tutaj z Google, szukając tego samego w węźle - Milan Babuškov
Przyzwyczajenie Date.now() / 1000 | 0 cierpieć z powodu Problem z rokiem 2038? new Date('Jan 1, 2039') / 1000 | 0 == -2117514496 - gengkev
lub nawet bez użycia Math.floor .. ~~(Date.now() / 1000) - code ninja
@ MilanBabuškov, ale plik node.js obsługuje Date.now() - OrangeDog
Podczas +new Data jest sprytny, nie jest czytelny dla innych programistów. Date.now() jest bardziej przejrzysty i zapewnia, że ​​wszyscy wiedzą, co się dzieje. - Harry Sadler


Podoba mi się to, ponieważ jest mały:

+new Date

Podoba mi się również to, ponieważ jest tak samo krótki i zgodny z nowoczesnymi przeglądarkami, a ponad 500 osób głosowało, że jest lepiej:

Date.now()

432
2018-02-18 00:33



Ta opcja to zły pomysł. Łatwo go przeoczyć, wygląda jak literówka i w rzeczywistości polega na efektach ubocznych języka. Widzę zły kod. - inanutshellus
@Billy Jak pamiętam, obliczyłem znacznik czasu w dwóch sugerowanych rozwiązaniach 1M razy w każdym i obliczyłem średni czas pracy. Uruchomiłem go w Firefoksie i Chrome, dzięki czemu getTime jest szybszy w obu przeglądarkach. To powiedziawszy, nawet gdyby był (marginalnie) wolniejszy, wybrałbym new Date().getTime(). Na szczęście dla mnie szybsze rozwiązanie jest już czytelnym rozwiązaniem! - inanutshellus
Uzgodniono z @ FabrícioMatté. Jednoargumentowe zachowanie operatora może nie być elementarne, ale jeśli go nie przemyślisz, nie spodziewaj się, że będzie on w stanie efektywnie działać w wielu zespołach. - Jason T Featheringham
@Niklaus To dlatego, że łączysz go z innym ciągiem. W tym wypadku, new Date().toString() jest nazywany. - kirb
z ciekawości, co to jest +operator robi, aby wydobyć go jak strunę? - Grundizer


JavaScript działa z liczbą milisekund od epoki, podczas gdy większość innych języków pracuje z sekundami. Możesz pracować z milisekundami, ale jak tylko podasz wartość, aby powiedzieć PHP, funkcje natywne PHP prawdopodobnie się nie powiedzie. Więc, aby upewnić się, zawsze używam sekund, a nie milisekund.

Da ci to uniksowy znacznik czasu (w sekundach):

var unix = Math.round(+new Date()/1000);

To da ci milisekundy od epoki (nie czasownika Unixa):

var milliseconds = new Date().getTime();

230
2018-05-11 22:27



PHP powinno działać dobrze z milisekundami, ponieważ używa ich sam z funkcją microtime (). - Nico Burns
Podczas gdy funkcja microtime () jest obecna, większość funkcji związanych z czasem w php oczekuje, że znacznik czasu będzie w sekundach, a nie w milisekundach. Co więcej, funkcja microtime () zwraca zmiennoprzecinkową (jeśli spełnisz wartość true), gdzie część dziesiętna jest ułamkiem sekundy (z dokładnością do mikrosekundy), podczas gdy newDate (). GetTime () zwraca wartość int, która odlicza milisekundy, ponieważ epokę. Na przykład (php), gdybyś zadzwonił na podłogę (microtime (true)), byłby to faktycznie ten sam czas, co time (), który jest w sekundach, a nie w mikro lub milisekundach. Dzielenie przez 1000 jak powyżej jest najłatwiejszym rozwiązaniem. - gregghz
Zamiast okrągłej, użyj podłogi. 700 ms wciąż nie jest całkowitą sekundą - Anagmate


var time = Date.now || function() {
  return +new Date;
};

time();

126
2017-10-21 10:05



Dlaczego || operator? Czy funkcja Date.now () jest niedostępna we wszystkich przeglądarkach? - Chris Noe
Najwyraźniej nie, znalazłem kod w modułach - Staale
Date.now () pochodzi z JavaScript 1.5 i nie jest obsługiwany w IE 8. - Søren Løvborg
Silniki, które nie zostały zaktualizowane w celu obsługi metody Date.now, mogą obejść ten brak, używając następującej metody: if (! Date.now) {Date.now = function now () {return + (new Date); }; } - Per Quested Aronsson
IE jest całkowitym rakiem. - SkuraZZ


Dostarczam wiele rozwiązań z opisami w tej odpowiedzi. Jeśli nic nie jest jasne, zadawaj pytania
PS: niestety ktoś połączył to z najwyższą odpowiedzią bez przyznawania kredytu.


Szybkie i brudne rozwiązanie:

Date.now() /1000 |0

Ostrzeżenie: to moc Przerwij w 2038 i zwróć ujemne liczby, jeśli to zrobisz |0 magia. Posługiwać się Math.floor() zamiast tego do tego czasu


95
2017-07-12 07:15



| 0 jest podobne do Math.floor (), ponieważ jest operacją bitową (która nie działa z float). zwykle jest jeszcze szybszy niż Math.floor (), ponieważ nie jest wywołaniem funkcji, jest to macierzysty operator javascript. - GottZ
Date.now() odniesienie: developer.mozilla.org/en-US/docs/JavaScript/Reference/... - Web_Designer
@Christophe, dlaczego tak myślisz? z powodu poprawki IE? z wyjątkiem tej części, która jest całkiem prosta i konfigurowalna, myślę. - GottZ
polyfills / shims nie są skomplikowane. Wynika to z konieczności obsługi 9 różnych wersji przeglądarek i branży decydującej się na wybór standardów, które przyjmują i które właśnie tworzą. - rlemon
Dla porównania najbardziej kompaktową cechą jest new Date/1e3|0. - Derek 朕會功夫


var timestamp = Number(new Date()); // current time as number

69
2017-10-21 13:00





jQuery zapewnia własną metodą aby uzyskać znacznik czasu:

var timestamp = $.now();

(Poza tym po prostu implementuje (new Date).getTime() wyrażenie)

REF:  http://api.jquery.com/jQuery.now/


50
2018-03-15 14:19



jQuery zajmie się również problemami ze zgodnością różnych przeglądarek z różnymi interfejsami JavaScript API. - Henry Heleine
@VisioN Szukałem sposobu na tworzenie znaczników czasu w pliku Node.js. Znalazłem pytanie javascript w stackoverflow i otrzymałem odpowiedź w jQuery, która nie pomaga. JavaScript i jQuery to dwie rzeczy. Jeśli udzielimy odpowiedzi na wszystkie ramy javascript, otrzymamy prawdopodobnie nieskończoną liczbę odpowiedzi, co jest sprzeczne z filozofią Q / A in stackoverflow. Również: i.stack.imgur.com/Ledgt.gif :RE - Pierre Arlaud
@PierreArlaud O jakiej filozofii mówisz? jQuery to świat Nr. 1 biblioteka napisana w czystym JavaScriptu, której głównym celem jest dostarczenie narzędzi użyteczności dla różnych przeglądarek. Jak widać z odpowiedzi, jQuery używa (new Date).getTime() podejście, dlatego jest wystarczająco bezpieczny do użycia nawet w IE6, przeciwnie do, powiedzmy, Date.now(). W przeciwnym razie, jeśli tworzysz stronę internetową i używasz jQuery, dlaczego nie skorzystać z krótkiego, przydatnego rozwiązania $.now() zamiast tracić czas i szukać uniwersalnego kodu w czystym JS. I to jest co najmniej coś innego niż podane tutaj odpowiedzi na te same treści. - VisioN
@VisioN Kto powiedział, że javascript musi być używany w przeglądarce? - Pierre Arlaud
@PierreArlaud A kto powiedział, że to pytanie dotyczy tylko NodeJS? - VisioN