Я даю несколько решений с описаниями в этом ответе. Не стесняйтесь задавать вопросы, если что-то неясно
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