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

3722

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

Нечто похожее на временную метку Unix, то есть на один номер, который представляет текущее время и дату. Либо как число, либо строка.

  • 0
    Как получить 64-битную метку времени в JS?
  • 0
    @AlexanderMills Поскольку JavaScript не поддерживает 64-битные целые, вам нужно получить два 32-битных целых числа. Задайте другой вопрос.
Теги:
datetime
timestamp
date
unix-timestamp

37 ответов

4170
Лучший ответ

Короткие и шикарные:

+ 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());
  • 10
    Другое известное исключение - это node.js. Я пришел сюда из Google, пытаясь сделать то же самое в узле
  • 42
    Не будет Date.now() / 1000 | 0 страдают от проблемы 2038 года ? new Date('Jan 1, 2039') / 1000 | 0 == -2117514496
Показать ещё 13 комментариев
457

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

+new Date

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

Date.now()
  • 582
    Этот вариант плохая идея. Его легко не заметить, он выглядит как опечатка и в действительности зависит от языкового побочного эффекта. Я вижу плохой код.
  • 10
    @ Билли Насколько я помню, я вычислил временную метку в двух предложенных решениях по 1M раз каждый и вычислил среднее время выполнения. Я запускал его в Firefox и Chrome, причем getTime был быстрее в обоих браузерах. Тем не менее, даже если бы это было (незначительно) медленнее, я бы выбрал new Date().getTime() . К счастью для меня, более быстрое решение - уже разборчивое решение!
Показать ещё 14 комментариев
234

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

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

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

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

var milliseconds = new Date().getTime();
  • 4
    PHP должен нормально работать с миллисекундами, так как он сам использует их с функцией microtime ().
  • 5
    Хотя функция microtime () присутствует, большинство связанных с временем функций в php ожидают, что отметка времени будет в секундах, а не в миллисекундах. Более того, microtime () возвращает число с плавающей запятой (если вы передаете true), где десятичная часть - это доли секунды (с точностью до микросекунды), а newDate (). GetTime () возвращает целое число, в котором он просто считает миллисекунды, так как эпоха. Например, (php), если бы вы вызывали floor (microtime (true)), это фактически было бы то же самое, что и time () вызова, которое выражается в секундах, а не в микро- или миллисекундах. Деление на 1000, как указано выше, является самым простым решением для этого.
Показать ещё 1 комментарий
133
var time = Date.now || function() {
  return +new Date;
};

time();
  • 6
    Почему || оператор? Date.now () доступен не во всех браузерах?
  • 0
    Видимо нет, я нашел код в modulejs
Показать ещё 2 комментария
110

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


Быстрое и грязное решение:

Date.now() /1000 |0

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

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

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

Некоторая занудная альтернатива Дерека 功夫 會 功夫 взята из комментариев ниже этого ответа:

new Date/1e3|0

Polyfill, чтобы заставить 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 Docs, что делает полифилл устаревшим, так $.now() внутренне $.now() делает то же самое: (new Date).getTime()

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


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

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

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

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


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

  • 10
    | 0 похож на Math.floor (), так как это битовая операция (которая не работает с плавающей точкой). обычно это даже быстрее, чем Math.floor (), поскольку это не вызов функции, это собственный оператор javascript.
  • 8
    Date.now() : developer.mozilla.org/en-US/docs/JavaScript/Reference/…
Показать ещё 4 комментария
74
var timestamp = Number(new Date()); // current time as number
56

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

var timestamp = $.now();

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

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

  • 2
    jQuery также позаботится о любых проблемах совместимости между различными браузерами с различными API-интерфейсами JavaScript.
  • 4
    @ VisioN Я искал способ делать отметки времени в Node.js. Я нашел вопрос javascript в stackoverflow и получил ответ в jQuery, который не помогает. Javascript и jQuery - это две вещи. Если мы дадим ответы на все фреймворки javascript, мы получим бесконечное количество ответов, что противоречит философии Q / A в stackoverflow. Также: i.stack.imgur.com/Ledgt.gif : D
Показать ещё 9 комментариев
39

Просто добавьте здесь функцию, чтобы вернуть строку timestamp в Javascript. Пример: 15:06:38 PM

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;
}
  • 10
    ОП запрашивает целочисленную временную метку; это строковое представление времени.
  • 3
    «похоже на временную метку Unix, то есть одно число, представляющее текущее время»
Показать ещё 1 комментарий
38

console.log(new Date().valueOf()); // returns the number of milliseconds since the epoch
  • 4
    Это равно +new Date .. :)
  • 8
    просто сделайте Date.now()
Показать ещё 5 комментариев
34

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

console.log(new Date().toISOString());
  • 0
    Он не возвращает целое число с вопросом, который запрашивается!
  • 0
    @AlexVentura со строковым форматом даты ISO, вы можете создать экземпляр объекта даты и вычесть между ними. Например: new Date("2017-05-04T07:11:28.940Z") - new Date("2017-05-04T07:11:14.092Z")
28

Тот, который я еще не видел

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

Еще один, которого я еще не видел,

var _ = require('lodash'); // from here https://lodash.com/docs#now
_.now();
  • 1
    Date.now() /1000 |0 делает то же самое и получил ответ раньше
  • 3
    Что ж. я уверен, что отредактировал в нем Math.floor() но только чтобы прояснить, что он имеет тот же эффект, что и |0 . Я не хотел причинить тебе боль или что-то еще. Я просто хотел сказать вам, что ваш ответ каким-то образом уже существует. Глядя на все приведенные ответы, есть те, которые каким-то образом замечают слово.
Показать ещё 1 комментарий
26

Date, нативный объект в JavaScript - это способ получения всех данных о времени.

Просто будьте осторожны в JavaScript, временная метка зависит от набора клиентских компьютеров, поэтому она не является точной на 100%. Чтобы получить наилучший результат, вам нужно получить временную метку со стороны сервера.

В любом случае, я предпочитаю использовать ваниль. Это распространенный способ сделать это в JavaScript:

Date.now(); //return 1495255666921

В MDN упоминается, как показано ниже:

Метод Date.now() возвращает количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 UTC.
Поскольку now() является статическим методом Date, вы всегда используете его как Date.now().

Если вы используете версию ниже ES5, Date.now(); не работает и вам нужно использовать:

new Date().getTime();
25

Код Math.floor(new Date().getTime()/1000) можно сократить до new Date/1E3 | 0 new Date/1E3 | 0

Попробуйте пропустить прямой getTime() и использовать | 0 | 0 в качестве замены для функции Math.floor(). Также хорошо помнить, что 1E3 является более коротким эквивалентом для 1000 (заглавная буква E предпочтительнее, чем строчная, чтобы указать 1E3 в качестве константы).

В результате вы получите следующее:

var ts = new Date / 1E3 | 0;

console.log(ts);
  • 12
    Да, не уменьшайте код вручную, особенно для экономии 1 байта.
  • 3
    @dchest "Math.floor(new Date().getTime()/1000)".length == 37; "new Date/1E3|0".length == 14; 37 -14 = 23 байта;
Показать ещё 6 комментариев
24

Метод Date.getTime() может использоваться с небольшой настройкой:

Значение, возвращаемое методом getTime, - это количество миллисекунд с 1 января 1970 года 00:00:00 по UTC.

Разделите результат на 1000, чтобы получить временную метку Unix, floor, если необходимо:

(new Date).getTime() / 1000

Метод Date.valueOf() функционально эквивалентен Date.getTime(), что позволяет использовать арифметические операторы на объекте даты для достижения идентичных результатов. На мой взгляд, этот подход влияет на читаемость.

  • 7
    Вам не нужны круглые скобки: new Date().getTime() / 1000
  • 14
    Они вам не нужны, но они делают код более читабельным (ИМХО). Вопрос вкуса, я думаю.
Показать ещё 1 комментарий
19

Вы можете использовать только

    var timestamp = new Date().getTime();
    console.log(timestamp);

чтобы получить текущую временную метку. Не нужно ничего делать.

19

// The Current Unix Timestamp
// 1443534720 seconds since Jan 01 1970. (UTC)

// seconds
console.log(Math.floor(new Date().valueOf() / 1000)); // 1443534720
console.log(Math.floor(Date.now() / 1000)); // 1443534720
console.log(Math.floor(new Date().getTime() / 1000)); // 1443534720

// milliseconds
console.log(Math.floor(new Date().valueOf())); // 1443534720087
console.log(Math.floor(Date.now())); // 1443534720087
console.log(Math.floor(new Date().getTime())); // 1443534720087

// jQuery
// seconds
console.log(Math.floor($.now() / 1000)); // 1443534720
// milliseconds
console.log($.now()); // 1443534720087
<script src="/jquery.min.js"></script>
19

Я настоятельно рекомендую использовать /moment.js. Чтобы получить число миллисекунд с эпохи UNIX, сделайте

moment().valueOf()

Чтобы получить количество секунд с момента UNIX, сделайте

moment().unix()

Вы также можете конвертировать так:

moment('2015-07-12 14:59:23', 'YYYY-MM-DD HH:mm:ss').valueOf()

Я делаю это все время. Каламбур не предназначен.

Использовать /moment.js в браузере:

<script src="/moment.js"></script>
<script>
    moment().valueOf();
</script>

Для получения дополнительной информации, включая другие способы установки и использования MomentJS, см. их docs

19

Вот простая функция для создания метки времени в формате: mm/dd/yy hh: mi: ss

function getTimeStamp() {
    var now = new Date();
    return ((now.getMonth() + 1) + '/' +
            (now.getDate()) + '/' +
             now.getFullYear() + " " +
             now.getHours() + ':' +
             ((now.getMinutes() < 10)
                 ? ("0" + now.getMinutes())
                 : (now.getMinutes())) + ':' +
             ((now.getSeconds() < 10)
                 ? ("0" + now.getSeconds())
                 : (now.getSeconds())));
}
  • 9
    @ b123400 - вот версия Lisp: (new (chain (-date) (to-iso-string))) .
17

Для временной метки с разрешением в микросекундах performance.now:

function time() { 
  return performance.now() + performance.timing.navigationStart;
}

Это может быть, например, выход 1436140826653.139, а Date.now дает только 1436140826653.

15

Сегодня - 2018.06.27. Я приведу сравнение времени для чисто js-решений. Это может быть полезно для людей, которые хотят получить/измерить время в JS легким и эффективным способом (например, для приложений реального времени, таких как симуляции, игры и т.д.)

Протестировано на MacO High Sierra 10.13.3 на Chrome 67.0.3396.99 (64-разрядная версия), Safari 11.0.3 (13604.5.6), Firefox 59.0.2 (64-разрядная версия). На скриншоте ниже я показываю вам результаты для самого быстрого браузера (Safari):

Изображение 2016

Как я Date.now() был самым быстрым способом получения метки времени для всех трех браузеров. Safari выполняет 19,2 млн операций в секунду, Firefox 16,1 млн, Chrome 7,8 млн.

new Date()*1 была самой медленной для Chrome (2.8M) и Firefox (2.6M). Number(new Date()) было самым медленным для Safari (2,9 млн).

Таким образом, JS-код победителя - Date.now() а самый быстрый браузер - Safari (в 2 раза быстрее, чем Chrome!).

Вы можете выполнить тестирование на вашем компьютере здесь: https://jsperf.com/timestamp-test-x.

15

Любые браузеры не поддерживаются Date.now, вы можете использовать это для получения текущего времени:

currentTime = Date.now() || +new Date()
  • 3
    (Перефразируя мой комментарий) Ваш код имеет проблему: он выполняет метод Date.now вместо того, чтобы сначала проверять его поддержку. В старых браузерах Date.now не является ошибкой функции .
  • 0
    Возможно, лучшей альтернативой было бы использовать троичный оператор, чтобы утверждать, что Date.now действительно существует (и является функцией), прежде чем пытаться вызвать его: currentTime = typeof Date.now === "function" ? Date.now() : +new Date() .
13

Если вам нужен базовый способ создания метки времени в Node.js, это хорошо работает.

var time = process.hrtime();
var timestamp = Math.round( time[ 0 ] * 1e3 + time[ 1 ] / 1e6 );

Наша команда использует это для защиты кеша в локальной среде. Вывод /dist/css/global.css?v=245521377, где 245521377 - это метка времени, созданная hrtime().

Надеюсь, это поможет, вышеприведенные методы могут работать, но я нашел, что это самый простой подход для наших потребностей в Node.js.

13

У этого есть решение: которое преобразует метку unixtime в tim в js, попробуйте это

var a = new Date(UNIX_timestamp*1000);
var hour = a.getUTCHours();
var min = a.getUTCMinutes();
var sec = a.getUTCSeconds();
12

Кажется, что это работает.

console.log(clock.now);
// returns 1444356078076

console.log(clock.format(clock.now));
//returns 10/8/2015 21:02:16

console.log(clock.format(clock.now + clock.add(10, 'minutes'))); 
//returns 10/8/2015 21:08:18

var clock = {
    now:Date.now(),
    add:function (qty, units) {
            switch(units.toLowerCase()) {
                case 'weeks'   :  val = qty * 1000 * 60 * 60 * 24 * 7;  break;
                case 'days'    :  val = qty * 1000 * 60 * 60 * 24;  break;
                case 'hours'   :  val = qty * 1000 * 60 * 60;  break;
                case 'minutes' :  val = qty * 1000 * 60;  break;
                case 'seconds' :  val = qty * 1000;  break;
                default       :  val = undefined;  break;
                }
            return val;
            },
    format:function (timestamp){
            var date = new Date(timestamp);
            var year = date.getFullYear();
            var month = date.getMonth() + 1;
            var day = date.getDate();
            var hours = date.getHours();
            var minutes = "0" + date.getMinutes();
            var seconds = "0" + date.getSeconds();
            // Will display time in xx/xx/xxxx 00:00:00 format
            return formattedTime = month + '/' + 
                                day + '/' + 
                                year + ' ' + 
                                hours + ':' + 
                                minutes.substr(-2) + 
                                ':' + seconds.substr(-2);
            }
};
  • 1
    хорошие продвинутые сценарии, хорошая работа!
12

Для lodash и underscore используйте _.now.

var timestamp = _.now(); // in milliseconds
12

Я изучил действительно классный способ преобразования данного объекта Date в временную метку Unix из исходного кода JQuery Cookie на днях.

Вот пример:

var date = new Date();
var timestamp = +date;
  • 0
    Я собирался написать новый объект Date (). Вы можете консоль журнала (новый Date ()), а затем просмотреть связанные методы в новом объекте / функции Date ()
9

На момент написания этой статьи первому ответу было 9 лет, и с тех пор многое изменилось - не в последнюю очередь, у нас есть почти универсальная поддержка нехакерского решения:

Date.now()

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

const currentTimestamp = (!Date.now ? +new Date() : Date.now());

Это вернет миллисекунды со времени эпохи, конечно, не секунды.

Документация MDN на Date.now

9

Moment.js может абстрагироваться от большой боли при работе с датами Javascript.

Смотрите: http://momentjs.com/docs/#/displaying/unix-timestamp/

moment().unix();
  • 2
    Обратите внимание, что это дает количество секунд (не миллисекунд) с начала UNIX. Если вы хотите миллисекунды, используйте moment().valueOf() . Смотри мой ответ.
7

более простой способ:

var timeStamp=event.timestamp || new Date().getTime();
  • 1
    Что такое event ?
  • 0
    Знаешь, откуда происходит event . Вам нужно дать лучшее объяснение того, как вы решаете эту проблему, вместо того, чтобы писать ответ. Пожалуйста!
Показать ещё 1 комментарий
5

Иногда мне это нужно в объектах для вызовов xmlhttp, поэтому мне это нравится.

timestamp : parseInt(new Date().getTime()/1000, 10)
  • 0
    Еще короче: new Date().getTime()/1000|0 но он медленный и грязный
  • 0
    Я собирался написать новый объект Date (). Вы можете консоль журнала (новый Date ()), а затем просмотреть связанные методы в новом объекте / функции Date ()
3
var d = new Date();
console.log(d.valueOf()); 
  • 0
    Я собирался написать новый объект Date (). Вы можете консоль журнала (новый Date ()), а затем просмотреть связанные методы в новом объекте / функции Date (). новый метод Date (). getTime () даст вам время в формате EPOCH, которое можно интерпретировать при необходимости
3

Рекомендуемый, правильный способ - Number(new Date()), с точки зрения удобочитаемости кода,

Кроме того, UglifyJS и Google-Closure-Compiler уменьшают сложность проанализированного дерева логики кода (релевантно, если вы используете один из них, чтобы скрыть/уменьшить код).

для временной метки Unix, которая имеет меньшее временное разрешение, просто делите текущее число с помощью 1000, сохраняя целое.

2

var my_timestamp = ~~(Date.now()/1000);

  • 0
    это всегда работает?
  • 2
    Почему понизить? ~~ это же parseInt .. хорошая плохая школа
1
function getTimeStamp() {
    var now = new Date();
    return ((now.getMonth() + 1) + '/' +
            (now.getDate()) + '/' +
             now.getFullYear() + " " +
             now.getHours() + ':' +
             ((now.getMinutes() < 10)
                 ? ("0" + now.getMinutes())
                 : (now.getMinutes())) + ':' +
             ((now.getSeconds() < 10)
                 ? ("0" + now.getSeconds())
                 : (now.getSeconds())));
}
0
new Date().getTime(); and Date.now();

>> Return current timestamp

new Date("11/01/2018").getTime()

>> Return required timestamp
  • 0
    Добавьте некоторые объяснения вместе с вашим кодом.
0

Вот еще одно решение для создания метки времени в JavaScript - в том числе метод заполнения для одиночных чисел - использование результата в день, месяц, год, час, минуту и ​​секунды (рабочий пример jsfiddle):

var pad = function(int) { return int < 10 ? 0 + int : int; };
var timestamp = new Date();

    timestamp.day = [
        pad(timestamp.getDate()),
        pad(timestamp.getMonth() + 1), // getMonth() returns 0 to 11.
        timestamp.getFullYear()
    ];

    timestamp.time = [
        pad(timestamp.getHours()),
        pad(timestamp.getMinutes()),
        pad(timestamp.getSeconds())
    ];

timestamp.now = parseInt(timestamp.day.join("") + timestamp.time.join(""));
alert(timestamp.now);
-20
time = Math.round(((new Date()).getTime()-Date.UTC(1970,0,1))/1000);
  • 10
    Это не верно. Метод getTime () уже возвращает количество миллисекунд с начала эпохи UNIX, так что это вычисление действительно испортит ситуацию.
  • 5
    @ Скорее всего, ничего не испорчено. Date.UTC(1970,0,1) всегда будет иметь значение 0, независимо от того, в каком часовом поясе находится пользователь. Date.UTC(1970,0,1) не менее, я бы сказал, что это плохой ответ из-за этого.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню