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


4016

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

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


Как получить 64-битную метку времени в JS?
Александр Миллс

@AlexanderMills Поскольку JavaScript не поддерживает 64-битные целые, вам нужно получить два 32-битных целых числа. Задайте другой вопрос.
wizzwizz4

Ответы:


4917

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

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


11
Другое известное исключение - это node.js. Я пришел сюда из Google, пытаясь сделать то же самое в узле
Милан Бабушков

57
Не Date.now() / 1000 | 0пострадает ли проблема 2038 года ? new Date('Jan 1, 2039') / 1000 | 0 == -2117514496
gengkev

3
или даже без использования Math.floor ..~~(Date.now() / 1000)
Matej

14
@ MilanBabuškov, но node.js поддерживаетDate.now()
OrangeDog

51
Хотя +new Dataон умный, он не читается другими разработчиками. Date.now()понятнее и гарантирует, что все остальные знают, что происходит.
Гарри Садлер

514

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

+new Date

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

Date.now()

636
Этот вариант плохая идея. Его легко не заметить, он выглядит как опечатка и в действительности зависит от языкового побочного эффекта. Я вижу плохой код.
inanutshellus

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

11
Согласился с @ FabrícioMatté. Поведение унарного оператора может быть не элементарным, но если вы не разбираетесь в нем, не ожидайте, что сможете эффективно функционировать во многих командах.
Джейсон Т Ферингем

9
@Niklaus Это потому, что вы соединяете его с другой строкой. В таком случае new Date().toString()называется.
Кирб

7
из любопытства, что +делает оператор, чтобы он выглядел как строка?
Задубз

276

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 () возвращает int, где он просто считает миллисекунды, так как эпоха. Например, (php), если бы вы вызывали floor (microtime (true)), это фактически было бы то же самое, что и time () вызова, которое указывалось в секундах, а не в микро- или миллисекундах. Деление на 1000, как указано выше, является самым простым решением для этого.
gregghz

49
Вместо круглых используйте пол. 700 мс все еще не целая секунда
Anagmate

Unix timestampпротив Seconds since the Epoch. Разве эти двое не должны означать одно и то же?
Мудиага Эженави

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

time();

6
Почему || оператор? Date.now () доступен не во всех браузерах?
Крис Ноу

67
Date.now () из JavaScript 1.5 и не поддерживается в IE 8.
Сорен Лёвборг,

9
Модули, которые не были обновлены для поддержки метода Date.now, могут обойти его отсутствие, используя следующий shim: if (! Date.now) {Date.now = function now () {return + (new Date); }; }
По заданному Аронссону

или(Date.now||function(){return +new Date})();

130

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

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


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

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

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

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


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


12
| 0 похож на Math.floor (), так как это битовая операция (которая не работает с плавающей точкой). обычно это даже быстрее, чем Math.floor (), поскольку это не вызов функции, это собственный оператор javascript.
GottZ


@ Кристоф, почему ты так думаешь? из-за IE исправить? кроме той части это довольно просто и настраиваемо, я думаю.
GottZ

5
полифилы / прокладки не сложны. Они являются результатом необходимости поддерживать 9 различных версий браузеров, и отрасль решает выбрать, какие стандарты они принимают, а какие просто составляют.
rlemon

8
Для справки самое компактное, что вы можете получить new Date/1e3|0.
Дерек 功夫 會 功夫


61

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
Пьер Арло

5
@VisioN Кто сказал, что JavaScript должен использоваться в браузере?
Пьер Арло

5
@PierreArlaud А кто сказал, что этот вопрос касается только NodeJS?
VisioN

2
@KingRider В этом нет необходимости parseInt, поскольку полученное значение всегда будет a Number.
VisioN

46

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


4
Это равно +new Date.. :)
19h

8
просто сделайDate.now()
Орландо

@ Орландо см. Другие ответы, проблема с now () - поддержка браузера
Кристоф

@Christophe просто сделайте простое заполнение, developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Орландо,

@Christophe Date.now () быстрее, чем Date (). ValueOf () .. jsperf.com/new-date-vs-date-now-vs-performance-now/6, так что лучше, если вы просто используете polyfill, когда не доступен.
Орландо

43

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

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


Он не возвращает целое число с вопросом, который запрашивается!
alexventuraio

@AlexVentura со строковым форматом даты ISO, вы можете создать экземпляр объекта даты и вычесть между ними. Например:new Date("2017-05-04T07:11:28.940Z") - new Date("2017-05-04T07:11:14.092Z")
Joaquinglezsantos

41

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

11
ОП запрашивает целую временную метку; это строковое представление времени.
Брэд Кох

3
«похоже на временную метку Unix, то есть на единственное число, представляющее текущее время»
Брэд Кох

У меня был код для отображения времени, но в некоторых частях Австралии была указана полная дата, этот скрипт помог мне разбить его и отобразить правильно. (+1 за это)
Syfer

40

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

29

Один я еще не видел

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делает то же самое и получил ответ раньше
GottZ

3
хорошо. я уверен, что отредактировал Math.floor()его, но только чтобы прояснить, что он имеет тот же эффект, что и |0. Я не хотел причинить тебе боль или что-то еще. Я просто хотел сказать вам, что ваш ответ каким-то образом уже существует. Глядя на все приведенные ответы, есть те, которые каким-то образом замечают слово.
GottZ

Я думаю, что импортировать всю библиотеку Lodash для использования _.now()немного излишне. Я бы рекомендовал импортировать только те функциональные возможности Lodash, которые вам нужны (в данном случае _.now () в NPM ), но даже они отказались от своего пакета в пользу простого использования Date.now().
mgthomas99

27

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
Ry-

14
Они вам не нужны, но они делают код более читабельным (ИМХО). Вопрос вкуса, я думаю.
Джондо

Вам даже не нужно ()после того, как new Dateи .getTime()так /будет отбрасывать объект Date в число так или иначе.
Дерек 朕 會 功夫

25

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

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

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

var ts = new Date / 1E3 | 0;

console.log(ts);


3
@dchest "Math.floor(new Date().getTime()/1000)".length == 37; "new Date/1E3|0".length == 14; 37 -14 = 23 байта;
Валентин Подкаменный

@MatthieuCharbonnier Что именно не читается? Знак деления, 1E3, труба или ноль? Пожалуйста, посмотрите фрагмент кода в моем ответе выше.
Валентин Подкаменный

1
@Valentin Вы минимизируете / усложняете простой код практически без пользы. Я не вижу смысла делать это. Мы не на Code Golf!
Матье Шарбоннье,

@ MatthieuCharbonnier, тут нет ничего сложного, только основной синтаксис и операторы. Главное - написать короткий, понятный и понятный код.
Валентин Подкаменный

2
@Valentin Пожалуйста, объясните мне, как замена Math.floor()на |0делает этот код "ясным и понятным". Объясните мне, в чем смысл сохранять 1 байт путем замены 1000на 1E3. Это смешно. Я вижу плохой код.
Матье Шарбоннье

24

Представление

Сегодня - 2020.04.23 Я выполняю тесты для выбранных решений. Я тестировал на MacOs High Sierra 10.13.6 на Chrome 81.0, Safari 13.1, Firefox 75.0

Выводы

  • Решение Date.now()(E) является самым быстрым в Chrome и Safari и вторым быстрым в Firefox, и это, вероятно, лучший выбор для быстрого кросс-браузерного решения.
  • Решение performance.now()(G), что удивительно, более чем в 100 раз быстрее других решений в Firefox, но медленнее в Chrome
  • Решения C, D, F довольно медленные во всех браузерах

введите описание изображения здесь

подробности

Результаты для хрома

введите описание изображения здесь

Вы можете выполнить тест на вашей машине ЗДЕСЬ

Код, используемый в тестах, представлен ниже


Мне было бы интересно, если бы вы проверили, performance.now()поскольку это должно быть наиболее точным с точки зрения марки.
SamsonTheBrave

@SamsonTheBrave спасибо за ваш комментарий - я обновляю ответ
Камил Келчевски

Круто, спасибо за ваше обновление! Я заметил, что вы видели разницу в скорости сейчас на Firefox. Это может быть результатом Firefox, privacy.reduceTimerPrecisionкоторый округляет результаты до ближайшей миллисекунды. Он также включен по умолчанию, но может быть отключен. developer.mozilla.org/en-US/docs/Web/API/Performance/now
SamsonTheBrave

22

Я настоятельно рекомендую использовать 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, см. Их документы


21

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

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

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



20

Вот простая функция для генерации метки времени в формате: мм / дд / гг чч: ми: сс

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

10
@ b123400 - Вот версия Лиспа: (new (chain (-date) (to-i-s-o-string))).
Инамати

20

// 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="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


16

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

currentTime = Date.now() || +new Date()

3
(Перефразируя мой комментарий) Ваш код имеет проблему: он выполняет метод Date.now вместо того, чтобы сначала проверять его поддержку. В старых браузерах Date.now не является ошибкой функции .
Салман А

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

14

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

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

14

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

Вот пример:

var date = new Date();
var timestamp = +date;

Я собирался написать новый объект Date (). Вы можете консоль журнала (новый Date ()), а затем просмотреть связанные методы в новом объекте / функции Date ()
sg28

14

Если вам нужен базовый способ создания метки времени в 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

Это похоже на работу.

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

13

Если это для целей регистрации, вы можете использовать ISOString

new Date().toISOString()

"2019-05-18T20: 02: 36.694Z"



10

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

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

moment().unix();

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

9

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

Date.now()

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

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

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

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


8

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

var timeStamp=event.timestamp || new Date().getTime();

Знаешь откуда event. Вам нужно дать лучшее объяснение того, как вы решаете проблему, вместо того, чтобы писать ответ. Пожалуйста!
alexventuraio

Я собирался написать новый объект Date (). Вы можете консоль журнала (новый Date ()), а затем просмотреть связанные методы в новом объекте / функции Date ()
sg28
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.