Питання Як отримати часовий прапорець у JavaScript?


Як я можу отримати мітку часу в JavaScript?

Щось подібне до часової позначки Unix, тобто одиничне число, яке відображає поточний час і дату. Або як рядок чи рядок.


3366
2017-10-21 09:29


походження


Як отримати 64-бітну мітку в JS? - Alexander Mills
@AlexanderMills Оскільки JavaScript не підтримує 64-бітні цілі числа, вам доведеться отримати дві 32-бітні цілі числа. Задайте інше питання. - wizzwizz4


Відповіді:


Короткі та Snazzy:

+ new Date()

Унарний оператор, як plus запускає valueOf метод в Date об'єкт, і він повертає позначку часу (без будь-яких змін).

Подробиці:

Майже у всіх поточних браузерах ви можете використовувати Date.now() щоб отримати часовий пояс UTC мілісекунди; винятком є ​​IE8 і раніше (див таблиця сумісності)

Тим не менш, ви можете легко зробити це:

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

Щоб отримати позначку часу секунд, ви можете використовувати:

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

Або ж можна використовувати:

Date.now() / 1000 | 0

Який повинен бути трохи швидше, але також менш читабельним (також див. цю відповідь)

Я б рекомендував використовувати Date.now() (з сумісністю). Це трохи краще, тому що воно коротше і не створює нове Date об'єкт Проте, якщо ви не хочете мати максимальну сумісність, ви можете використати "старий" метод, щоб отримати мітку часу мілісекунди:

new Date().getTime()

Тоді ви можете перетворити на такі секунди:

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

І ви також можете скористатись valueOf метод, який ми показали вище:

new Date().valueOf()

Мітка часу в мілісекундах

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());


4158
2017-10-21 09:32



Іншим помітним винятком є ​​вузол .js. Я прийшов сюди з Google, прагнучи зробити те ж саме в вузлі - Milan Babuškov
Не буде Date.now() / 1000 | 0 страждає від Рік 2038 проблеми? new Date('Jan 1, 2039') / 1000 | 0 == -2117514496 - gengkev
або навіть, без використання Math.floor .. ~~(Date.now() / 1000) - code ninja
@ MilanBabuškov але node.js підтримує Date.now() - OrangeDog
Поки +new Data є розумним, він не читається іншими розробниками. Date.now() це ясніше і гарантує, що всі ще знають, що відбувається. - Harry Sadler


Мені це подобається, тому що це мало:

+new Date

Мені також подобається це, тому що воно настільки коротке і сумісно з сучасними браузерами, і більше 500 людей проголосували, що краще:

Date.now()

432
2018-02-18 00:33



Цей варіант - погана ідея. Це легко помічають, виглядає як помилка, і насправді покладаються на побічний ефект мови. Я бачу поганий код. - inanutshellus
@Billy Як я пам'ятаю, я обчислив часовий покажчик у двох пропонованих рішеннях по 1 М раз на кожну, і розрахував середню тривалість виконання. Я запустив це в Firefox і Chrome, причому getTime було швидше в обох браузерах. Це сказало, навіть якщо б це було (маргінально) повільніше, я б вибрав new Date().getTime(). На щастя, для мене швидше рішення вже є розбірливим рішенням! - inanutshellus
Погоджено з @ FabrícioMatté. Поведінка унікального оператора може бути не рудиментарною, але якщо ви ще не зрозуміли це, не очікуйте, що зможе ефективно функціонувати в багатьох команд. - Jason T Featheringham
@Niklaus Це пов'язано з тим, що об'єднуєте його з іншим рядком. В такому разі, new Date().toString() називається. - kirb
з цікавості що таке +Оператор робить, щоб він вийшов, як рядок? - Grundizer


JavaScript працює з числом мілісекунд з епохи, тоді як більшість інших мов працюють із секундами. Ви могли б працювати з мілісекундами, але як тільки ви передаєте значення, щоб сказати PHP, національні функції PHP, ймовірно, не зможуть виконати. Так що я завжди використовую секунди, а не мілісекунди.

Це дасть вам часовий покажчик Unix (у секундах):

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

Це дасть вам мілісекунди з епохи (не означає Unix timestamp):

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

230
2018-05-11 22:27



PHP повинна працювати добре з мілісекундами, оскільки вона використовує їх сама за допомогою функції microtime (). - Nico Burns
У той час як microtime () присутня, більшість функцій, пов'язаних з часом у php, очікують, що часовий покажчик буде в секундах, а не в мілісекундах. Більше того, microtime () повертає поплавок (якщо ви передаєте істинне), де десяткова частина є часткою секунди (точна до мікросекунд), а newDate (). GetTime () повертає int, де він просто рахує мілісекунди, оскільки епоха Наприклад (php), якщо ви хочете називати підлогу (microtime (true)), це буде фактично таким самим, як час дзвінка (), який в секундах, а не мікро, або мілісекунди. Розподіл на 1000, як зазначено вище, є найпростішим рішенням для цього. - gregghz
Замість круглої, використовуйте підлогу. 700 мс ще не цілком другий - Anagmate


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

time();

126
2017-10-21 10:05



Чому || оператор Чи доступна Date.now () у всіх браузерах? - Chris Noe
Очевидно, ні, я знайшов код в модулі - Staale
Date.now () це з JavaScript 1.5, і не підтримується IE 8. - Søren Løvborg
Двигуни, які не були оновлені для підтримки методу Date.now, можуть обробити відсутність його за допомогою наступного блоку: if (! Date.now) {Date.now = function now () {return + (new Date); }; } - Per Quested Aronsson
IE є абсолютно раком. - SkuraZZ


Я даю декілька рішень з описом у цій відповіді. Не соромтеся задавати питання, якщо щось незрозуміло
PS: на жаль, хтось об'єднав це до найвищого відповіді без надання кредиту.


Швидке та брудне рішення:

Date.now() /1000 |0

УВАГА: це може прорив у 2038 році і повернення негативних цифр, якщо ви зробите це |0 магія Використовуйте Math.floor() замість цього часу


95
2017-07-12 07:15



| 0 схожий на Math.floor (), оскільки це операція bit (яка не працює з поплавками). як правило, це навіть швидше, ніж Math.floor (), оскільки це не виклик функції, це власний оператор Javascript. - GottZ
Date.now() довідка: developer.mozilla.org/en-US/docs/JavaScript/Reference/... - Web_Designer
@ Кристоф, чому ти це думаєш? через виправлення IE? крім цієї частини її досить простий і налаштовується я думаю. - GottZ
polyfills / shims не складні. Вони є результатом необхідності підтримувати 9 різних версій браузера, і галузь вирішує, які стандарти вони приймають і які вони просто складають. - rlemon
Для довідки найбільш компактний ви можете отримати це new Date/1e3|0. - Derek 朕會功夫


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

69
2017-10-21 13:00





jQuery забезпечує свій метод щоб отримати позначку часу:

var timestamp = $.now();

(крім того, він просто реалізує (new Date).getTime() вираз)

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


50
2018-03-15 14:19



jQuery також буде займатися проблемами сумісності між різними браузерами з різними API JavaScript. - Henry Heleine
@VisioN Я шукав спосіб зробити часові мітки в Node.js. Я знайшов запит javascript у stackoverflow, і я отримую відповідь у jQuery, що не допомагає. Javascript та jQuery - це дві речі. Якщо ми дамо відповіді на всі яваскринкові структури там, то в результаті ми можемо мати нескінченну кількість відповідей, що суперечить філософії Q / A у stackoverflow. Також: i.stack.imgur.com/Ledgt.gif : D - Pierre Arlaud
@PierreArlaud Що за філософію ви говорите? jQuery - це світовий номер. 1 бібліотека, написана чистою JavaScript, основною метою якої є надання крос-браузерних утиліт. Як видно з відповіді, використовується jQuery (new Date).getTime() підхід, отже, це досить безпечно для використання навіть в IE6, навпаки, скажімо, Date.now(). В іншому випадку, якщо ви розробляєте веб-сайт і використовуєте jQuery, чому б не використовувати коротке корисне рішення $.now() замість того, щоб підказати час і шукати універсальний код у чистому JS. І це, принаймні, відрізняється від інших тих самих відповідей на зміст, наведених тут. - VisioN
@VisioN Хто сказав, що яваскрипт потрібно використовувати в браузері? - Pierre Arlaud
@PierreArlaud І хто сказав, що це питання стосується тільки NodeJS? - VisioN


Щоб скластись, ось функція повернення строки timestamp у Javascript. Приклад: 15:06:38

function displayTime() {
    var str = "";

    var currentTime = new Date()
    var hours = currentTime.getHours()
    var minutes = currentTime.getMinutes()
    var seconds = currentTime.getSeconds()

    if (minutes < 10) {
        minutes = "0" + minutes
    }
    if (seconds < 10) {
        seconds = "0" + seconds
    }
    str += hours + ":" + minutes + ":" + seconds + " ";
    if(hours > 11){
        str += "PM"
    } else {
        str += "AM"
    }
    return str;
}

36
2017-09-21 19:12



OP задає питання про цільове часові позначки; це строкове подання часу. - Brad Koch
"аналогічна тимчасовій позначці Unix, тобто одиничне число, що відображає поточний час" - Brad Koch
У мене був код для відображення часу, але частина Австралії показала повну дату, цей скрипт допоміг мені розбити його і показати правильно. (+1 для цього) - Syfer


console.log(new Date().valueOf()); // returns the number of milliseconds since the epoch


34
2018-04-30 16:53



Це дорівнює +new Date.. :) - Kenan Sulayman
просто роби Date.now() - Orlando
@Orlando дивіться інші відповіді, проблема з now () - підтримка браузера - Christophe
@ Christophe просто зробити простий поліфіль, developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - Orlando
@Orlando точно, не просто робіть Date.now () - Christophe


На додаток до інших параметрів, якщо ви хочете, щоб датаформат ISO, ви отримуєте, можете отримати це безпосередньо

console.log(new Date().toISOString());


29
2018-01-29 15:08



Це не повертає ціле число, на яке запитується запитання! - Alex Ventura
@AlexVentura з рядком dateformat ISO ви можете проаналізувати об'єкт дат і віднімати між ними. Наприклад: new Date("2017-05-04T07:11:28.940Z") - new Date("2017-05-04T07:11:14.092Z") - Joaquinglezsantos


Я ще не бачив

Math.floor(Date.now() / 1000); // current time in seconds

Інший, якого я ще не бачив, є

var _ = require('lodash'); // from here https://lodash.com/docs#now
_.now();

22
2018-03-31 08:18



Date.now() /1000 |0 робить те ж саме, і йому вже дали відповідь - GottZ
добре. я обов'язково редагую Math.floor() в це, але лише щоб ясно зрозуміло, що він має такий же ефект, як і |0. Я не хотів завдати вам шкоди чи нічого. Я просто хотів сказати вам, що ваша відповідь на якийсь шлях вже існує. подивившись на всі отримані відповіді, у деякому сенсі з'являється така увага. - GottZ
Я думаю, що потрібно імпортувати всю бібліотеку Лодаш просто для використання _.now() трохи перегрібаєш. Я б рекомендував лише імпортувати функціональні можливості Lodash, які вам потрібно використовувати (у цьому випадку _.now () на NPM), але навіть вони втратили свій пакет на користь простого використання Date.now(). - mgthomas99