Як я можу отримати позначку часу в JavaScript?
Щось подібне до часової позначки Unix , тобто єдине число, яке представляє поточний час і дату. Або як число або рядок.
Як я можу отримати позначку часу в JavaScript?
Щось подібне до часової позначки Unix , тобто єдине число, яке представляє поточний час і дату. Або як число або рядок.
Відповіді:
+ new Date()
Одинарний оператор, як-от plus
запускає valueOf
метод в Date
об'єкті, і він повертає часову позначку (без будь-яких змін).
Деталі:
Практично на всіх поточних браузерах, які ви можете використовувати, Date.now()
щоб отримати позначку часу в мілісекундах ; помітним винятком з цього є 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());
Date.now() / 1000 | 0
постраждаєте від проблеми 2038 року ? new Date('Jan 1, 2039') / 1000 | 0 == -2117514496
~~(Date.now() / 1000)
Date.now()
+new Data
розумна, вона не читається іншими дияволами. Date.now()
чіткіше і гарантує, що всі інші знають, що відбувається.
Мені це подобається, тому що він невеликий:
+new Date
Мені це також подобається, тому що він такий же короткий і сумісний із сучасними браузерами, і понад 500 людей проголосували, що це краще:
Date.now()
new Date().getTime()
. На щастя для мене, швидше рішення - вже розбірливе рішення!
new Date().toString()
називається.
+
робить оператор, щоб він вийшов, як струна?
JavaScript працює з кількістю мілісекунд з епохи, тоді як більшість інших мов працює з секундами. Ви можете працювати з мілісекундами, але як тільки ви передасте значення, щоб сказати PHP, нативні функції PHP, ймовірно, не зможуть. Тож, щоб бути впевненим, я завжди використовую секунди, а не мілісекунди.
Це дасть вам часову позначку Unix (у секундах):
var unix = Math.round(+new Date()/1000);
Це дасть вам мілісекунд з епохи (не часової позначки Unix):
var milliseconds = new Date().getTime();
Unix timestamp
проти Seconds since the Epoch
. Чи не повинні ці двоє означати одне й те саме?
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);
Деректезна альтернатива Дерека 功夫 會 功夫 взята з коментарів нижче цієї відповіді:
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
Date.now()
довідка: developer.mozilla.org/en-US/docs/JavaScript/Reference/…
new Date/1e3|0
.
jQuery надає власний метод отримання позначки часу:
var timestamp = $.now();
(до того ж він просто реалізує (new Date).getTime()
вираз)
parseInt
, оскільки отримане значення завжди буде а Number
.
console.log(new Date().valueOf()); // returns the number of milliseconds since the epoch
+new Date
.. :)
Date.now()
На додаток до інших варіантів, якщо ви хочете, щоб формат дати ISO, ви можете отримати його безпосередньо
console.log(new Date().toISOString());
new Date("2017-05-04T07:11:28.940Z") - new Date("2017-05-04T07:11:14.092Z")
Просто для додавання, ось функція повернення рядка часової позначки в 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;
}
Дата , рідний об’єкт у JavaScript - це спосіб отримати всі дані про час.
Просто будьте уважні в JavaScript, часова мітка залежить від набору клієнтського комп'ютера, тому це не 100% точна часова марка. Щоб досягти найкращого результату, потрібно отримати позначку часу на стороні сервера .
У будь-якому випадку, моїм кращим способом є використання ванілі. Це звичайний спосіб зробити це в JavaScript:
Date.now(); //return 1495255666921
У MDN це зазначено нижче:
Метод Date.now () повертає кількість мілісекунд, що минула з 1 січня 1970 року 00:00:00 UTC.
Оскільки тепер () є статичним методом 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.now() /1000 |0
робить те саме, на що відповіли раніше
Math.floor()
в нього зміни, але тільки для того, щоб зрозуміти, що це має такий же ефект, як і |0
. я не хотів нашкодити тобі чи чомусь. я просто хотів сказати вам, що ваша відповідь якимось чином вже існує. дивлячись на всі відповіді, є деякі, які певним чином помічають слово.
_.now()
- це трохи зайвий рівень. Я рекомендую лише імпортувати функціонал Lodash, який потрібно використовувати (в даному випадку _.now () на NPM ), але навіть вони застаріли у своєму пакеті на користь просто використання Date.now()
.
Date.getTime()
Метод може бути використаний з трохи підправити:
Значення, повернене методом getTime, - це кількість мілісекунд з 1 січня 1970 року 00:00:00 UTC.
Розділіть результат на 1000, щоб отримати часову позначку Unix, floor
якщо необхідно:
(new Date).getTime() / 1000
Date.valueOf()
Метод функціонально еквівалентний Date.getTime()
, що робить можливим використовувати арифметичні операції на дати об'єкта для досягнення ідентичних результатів. На мою думку, такий підхід впливає на читаність.
new Date().getTime() / 1000
()
після new Date
і .getTime()
оскільки /
ви все одно буде передавати об'єкт Date в число.
Код Math.floor(new Date().getTime() / 1000)
можна скоротити до new Date / 1E3 | 0
.
Подумайте пропустити пряме getTime()
виклик і використовувати його | 0
як заміну Math.floor()
функції. Також добре пам’ятати 1E3
, що це коротший еквівалент 1000
(великі регістри Е є кращими, ніж малі, щоб позначати 1E3
як постійні).
В результаті ви отримуєте наступне:
var ts = new Date / 1E3 | 0;
console.log(ts);
"Math.floor(new Date().getTime()/1000)".length == 37;
"new Date/1E3|0".length == 14;
37 -14 = 23 байти;
Math.floor()
по |0
робить цей код «ясно і зрозуміло». Поясніть мені, в чому сенс зберегти 1 байт, замінивши 1000
на 1E3
. Це смішно. Я бачу поганий код.
Сьогодні - 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Результати для хрому
Ви можете виконати тест на своїй машині ТУТ
Код, використаний у тестах, представлений нижче фрагментом
performance.now()
як це має бути найбільш точним з точки зору штампа.
privacy.reduceTimerPrecision
який округляє результати до найближчої мілісекунди. Він також включений за замовчуванням, але його можна відключити. developer.mozilla.org/en-US/docs/Web/API/Performance/now
Дуже рекомендую використовувати 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, дивіться їхні документи
Для позначки часу з роздільною здатністю мікросекунди є performance.now
:
function time() {
return performance.now() + performance.timing.navigationStart;
}
Наприклад 1436140826653.139
, це може дати прибутковість , хоча Date.now
тільки дає 1436140826653
.
Можна використовувати тільки
var timestamp = new Date().getTime();
console.log(timestamp);
щоб отримати поточну мітку часу. Не потрібно нічого зайвого робити.
Ось проста функція для створення часової позначки у форматі: 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())));
}
(new (chain (-date) (to-i-s-o-string)))
.
// 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>
Будь-які браузери не підтримують Date.now, ви можете використовувати це для отримання поточного часу дати:
currentTime = Date.now() || +new Date()
Date.now
насправді існує (і функції), перш ніж намагатися викликати його: currentTime = typeof Date.now === "function" ? Date.now() : +new Date()
.
Днями я дізнався про класний спосіб перетворення заданого об’єкта Date в часову позначку Unix з вихідного коду Cookie JQuery .
Ось приклад:
var date = new Date();
var timestamp = +date;
Якщо ви хочете основний спосіб генерування часової позначки в Node.js, це добре працює.
var time = process.hrtime();
var timestamp = Math.round( time[ 0 ] * 1e3 + time[ 1 ] / 1e6 );
Наша команда використовує це, щоб перебрати кеш-пам'ять у середовищі localhost. Вихід , /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);
}
};
Для користувачів лодашу та підкреслення використовуйте _.now
.
var timestamp = _.now(); // in milliseconds
Moment.js може абстрагувати багато болю у роботі з датами Javascript.
Дивіться: http://momentjs.com/docs/#/displaying/unix-timestamp/
moment().unix();
moment().valueOf()
. Дивіться мою відповідь.
На момент написання цього запису, найвищої відповіді - 9 років, і з того часу багато що змінилося - щонайменше, у нас є універсальна підтримка не хакітичного рішення:
Date.now()
Якщо ви хочете бути абсолютно впевненими, що це не зламається в якомусь старовинному (до i9) браузері, ви можете поставити його за чек, наприклад:
const currentTimestamp = (!Date.now ? +new Date() : Date.now());
Це поверне мілісекунди з часу епохи, звичайно, не секунди.
більш простий спосіб:
var timeStamp=event.timestamp || new Date().getTime();
event
походить. Вам потрібно дати краще пояснення того, як ви вирішите це питання, а не писати відповідь. Будь ласка!