Как вы получаете метку времени в JavaScript? - PullRequest
3690 голосов
/ 21 октября 2008

Как я могу получить метку времени в JavaScript?

Что-то похожее на временную метку Unix, то есть одно число, представляющее текущее время и дату. В виде числа или строки.

Ответы [ 38 ]

4550 голосов
/ 21 октября 2008

Short & 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());
473 голосов
/ 18 февраля 2011

Мне нравится это, потому что оно маленькое:

+new Date

Мне также нравится это, потому что он такой же короткий и совместим с современными браузерами, и более 500 человек проголосовали за то, что он лучше:

Date.now()
254 голосов
/ 12 мая 2011

JavaScript работает с количеством миллисекунд с начала эпохи, тогда как большинство других языков работают с секундами. Вы можете работать с миллисекундами, но как только вы передадите значение, скажем, PHP, родные функции PHP, вероятно, потерпят неудачу. Поэтому, чтобы быть уверенным, я всегда использую секунды, а не миллисекунды.

Это даст вам метку времени Unix (в секундах):

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

Это даст вам миллисекунды с начала эпохи (не отметки времени Unix):

var milliseconds = new Date().getTime();
136 голосов
/ 21 октября 2008
var time = Date.now || function() {
  return +new Date;
};

time();
114 голосов
/ 12 июля 2012

Я даю несколько решений с описаниями в этом ответе. Не стесняйтесь задавать вопросы, если что-то неясно
PS: к сожалению, кто-то слил это в топ-ответ, не отдавая должное.


Быстрый и грязный раствор:

Date.now() /1000 |0

Предупреждение : это может сломаться в 2038 году и вернуть отрицательные числа, если вы используете магию |0. Вместо этого используйте Math.floor() к этому времени

Math.floor() решение:

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

Какой-нибудь занудный вариант от Дерек 朕 會 功夫 взят из комментариев ниже этого ответа:

new Date/1e3|0

Полифилл для получения Date.now() Работает:

Чтобы заставить его работать в IE, вы можете сделать это (Polyfill от MDN ):

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

Если вас не интересует год / день недели / летнее время, вы можете убрать его и использовать после 2038 года:

var now = (function () {
    var year = new Date(new Date().getFullYear().toString()).getTime();
    return function () {
        return Date.now() - year
    }
})();

Вывод того, как это будет выглядеть:

new Date()
Thu Oct 29 2015 08:46:30 GMT+0100 (Mitteleuropäische Zeit )
new Date(now())
Thu Oct 29 1970 09:46:30 GMT+0100 (Mitteleuropäische Zeit )

Конечно, это нарушит летнее время, но в зависимости от того, что вы строим это может быть полезно для вас, если вам нужно сделать бинарный операции с метками времени после int32 прервутся в 2038 году.

Это также будет возвращать отрицательные значения, но только если пользователь этого ПК Вы запускаете свой код меняет часы своего компьютера, по крайней мере, на 31 декабря предыдущего года.


Если вы просто хотите узнать относительное время с момента первого запуска кода, вы можете использовать что-то вроде этого:

var relativeTime = (function () {
    var start = Date.now();
    return function () {
        return Date.now() - start
    }
})();

Если вы используете jQuery, вы можете использовать $.now(), как описано в Документах jQuery , что делает полифилл устаревшим, поскольку $.now() внутренне делает то же самое: (new Date).getTime()

Если вы просто довольны версией jQuery, рассмотрите вариант ответа на этот ответ, поскольку я сам его не нашел.


Теперь небольшое объяснение того, что делает |0:

Предоставляя |, вы указываете интерпретатору выполнить двоичную операцию ИЛИ. Битовые операции требуют абсолютных чисел, которые превращают десятичный результат из Date.now() / 1000 в целое число.

Во время этого преобразования удаляются десятичные дроби, что приводит к тому же результату, что и использование Math.floor(), но с использованием меньшего количества кода.

Будьте осторожны: он преобразует 64-битное двойное в 32-битное целое число. Это приведет к потере информации при работе с огромными числами. Метки времени будут прерываться после 2038 года из-за переполнения 32-разрядного целого числа.


Для получения дополнительной информации о Date.now перейдите по этой ссылке: Date.now() @ MDN

80 голосов
/ 21 октября 2008
var timestamp = Number(new Date()); // current time as number
58 голосов
/ 15 марта 2013

jQuery предоставляет свой собственный метод для получения метки времени:

var timestamp = $.now();

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

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

40 голосов
/ 30 апреля 2009

console.log(new Date().valueOf()); // returns the number of milliseconds since the epoch
39 голосов
/ 21 сентября 2012

Просто для суммирования, вот функция для возврата строки метки времени в 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;
}
38 голосов
/ 29 января 2016

В дополнение к другим опциям, если вы хотите использовать формат даты ISO, вы можете получить его напрямую

console.log(new Date().toISOString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...