Как получить временную метку в JavaScript?
-
03-07-2019 - |
Вопрос
Как я могу получить временную метку в JavaScript?
Что-то похожее на временную метку Unix, то есть одно число, обозначающее текущее время и дату.Либо в виде числа, либо строки.
Решение
Коротко и эффектно:
+ 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());
Другие советы
Мне это нравится, потому что он маленький:
+new Date
Мне тоже это нравится, потому что он такой же короткий и совместим с современными браузерами, и более 500 человек проголосовали за то, чтобы он стал лучше:
Date.now()
JavaScript работает с количеством миллисекунд с начала эпохи, тогда как большинство других языков работают с секундами. Вы можете работать с миллисекундами, но как только вы передадите значение, скажем, PHP, родные функции PHP, вероятно, потерпят неудачу. Поэтому я всегда использую секунды, а не миллисекунды.
Это даст вам метку времени Unix (в секундах):
var unix = Math.round(+new Date()/1000);
Это даст вам миллисекунды с начала эпохи (не отметка времени Unix):
var milliseconds = new Date().getTime();
var time = Date.now || function() {
return +new Date;
};
time();
Я предоставляю несколько решений с описаниями в этом ответе. Не стесняйтесь задавать вопросы, если что-то неясно
PS: к сожалению, кто-то слил это в топ-ответ, не отдавая должное.
<Ч>
Быстрое и грязное решение:
Date.now() /1000 |0
Предупреждение : он может сломаться в 2038 году и вернуть отрицательные числа, если вы выполните
| 0
магия. Вместо этого используйтеMath.floor ()
к этому времени
Math.floor ()
решение:
Math.floor(Date.now() /1000);
<Ч>
Некоторая альтернатива от Дерек & # 26381; & # 26371; & # 21151; & # 22827; взята из комментарии под этим ответом:
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
var timestamp = Number(new Date()); // current time as number
jQuery предоставляет свой собственный метод для получения метки времени: р>
var timestamp = $.now();
(кроме того, он просто реализует выражение (новая дата) .getTime ()
)
console.log(new Date().valueOf()); // returns the number of milliseconds since the epoch
Просто добавим, вот функция для возврата строки метки времени в 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;
}
В дополнение к другим параметрам, если вам нужен ISO-формат даты, вы можете получить его напрямую.
console.log(new Date().toISOString());
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();
Я еще не видел
Math.floor(Date.now() / 1000); // current time in seconds
Еще один, которого я еще не видел, это
var _ = require('lodash'); // from here https://lodash.com/docs#now
_.now();
Date.getTime ()
метод можно использовать с небольшим изменением:
Значение, возвращаемое методом getTime, равно количеству миллисекунд. с 1 января 1970 года 00:00:00 UTC.
Разделите результат на 1000, чтобы получить метку времени Unix, этаж
при необходимости:
(new Date).getTime() / 1000
<Ч>
Метод Date.valueOf ()
функционально эквивалентен Date.getTime ()
, что позволяет использовать арифметические операторы для объекта даты для достижения идентичные результаты. На мой взгляд, такой подход влияет на читабельность.
Код 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);
Я настоятельно рекомендую использовать 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, см. их документы
Вот простая функция для генерации отметки времени в формате: мм / дд / гг чч: ми: сс
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())));
}
// 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>
Вы можете использовать только
var timestamp = new Date().getTime();
console.log(timestamp);
чтобы получить текущую метку времени.Не нужно делать ничего лишнего.
Для отметки времени с микросекундным разрешением существует .now код>
:
function time() {
return performance.now() + performance.timing.navigationStart;
}
Это может, например, привести к 1436140826653.139
, тогда как Date.now
дает только 1436140826653
.
Сегодня - 2018.06.27. Я приведу сравнение времени для чисто js-решений. Это может быть полезно для людей, которые хотят получить / измерить время в JS легким и эффективным способом (например, для приложений реального времени, таких как симуляции, игры и т. Д.)
Протестировано на MacOs High Sierra 10.13.3 на Chrome 67.0.3396.99 (64-разрядная версия), Safari 11.0.3 (13604.5.6), Firefox 59.0.2 (64-разрядная версия). На скриншоте ниже я покажу вам результаты для самого быстрого браузера (Safari):
Как я заметил, 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.9M). Р>
Таким образом, JS-код победителя - Date.now ()
, а самый быстрый браузер - Safari (в 2 раза быстрее, чем Chrome!).
Вы можете выполнить тестирование на своем компьютере здесь: https://jsperf.com/timestamp-test-x . р>
Любые браузеры, не поддерживаемые Date.now, вы можете использовать это для получения текущей даты:
currentTime = Date.now() || +new Date()
У этого есть решение: которое преобразует метку времени Unix во время в js, попробуйте это
var a = new Date(UNIX_timestamp*1000);
var hour = a.getUTCHours();
var min = a.getUTCMinutes();
var sec = a.getUTCSeconds();
Я узнал действительно крутой способ преобразования данного объекта Date в метку времени Unix из исходного кода JQuery Cookie на днях.
Вот пример:
var date = new Date();
var timestamp = +date;
Если вам нужен базовый способ создания метки времени в 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.
Это похоже на работу.
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);
}
};
Для lodash и подчеркивания пользователи, используйте _. now
.
var timestamp = _.now(); // in milliseconds
Moment.js может абстрагироваться от боли, связанной с датами Javascript. Р>
См .: http://momentjs.com/docs/#/displaying/unix -timestamp / р>
moment().unix();
На момент написания статьи верхнему ответу было 9 лет, и с тех пор многое изменилось - не в последнюю очередь, у нас есть почти универсальная поддержка нехакерского решения:
Date.now()
Если вы хотите быть абсолютно уверены, что это не сломается в каком-то древнем (до ie9) браузере, вы можете поставить его за чеком, например так:
const currentTimestamp = (!Date.now ? +new Date() : Date.now());
Это вернет миллисекунды со времени эпохи, конечно, не секунды.
более простой способ:
var timeStamp=event.timestamp || new Date().getTime();
иногда мне это нужно в объектах для вызовов xmlhttp, поэтому мне это нравится.
timestamp : parseInt(new Date().getTime()/1000, 10)