it-swarm.com.ru

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

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

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

3576
pupeno

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

+ 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. Однако, если вы не хотите использовать шим и максимальную совместимость, вы можете использовать «старый» метод, чтобы получить метку времени в milliseconds:

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

4438
daveb

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

+new Date

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

Date.now()
459
xer0x

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

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

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

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

var milliseconds = new Date().getTime();
248
Daithí
var time = Date.now || function() {
  return +new Date;
};

time();
133
Staale

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


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

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

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

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


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

112
GottZ
var timestamp = Number(new Date()); // current time as number
77
aemkei

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

var timestamp = $.now();

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

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

56
VisioN

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

39
Tom Viner

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

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

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

36
Joaquinglezsantos

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

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

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

Date.now(); //return 1495255666921

В MDN это упоминается ниже:

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

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

new Date().getTime();
28
Alireza

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

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

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

var _ = require('lodash'); // from here https://lodash.com/docs#now
_.now();
27
Belldandu

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

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

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

var ts = new Date / 1E3 | 0;

console.log(ts);

24
Valentin

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

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

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

(new Date).getTime() / 1000

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

24
Salman A

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

20
FullStack

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

19
blueberry0xff

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

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

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

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

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

19
Jitendra Pawar

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

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

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

17
iter

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

currentTime = Date.now() || +new Date()
15
mr.boyfox

Сегодня - 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):

 enter image description here

Как я заметил, функция 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 .

15
Kamil Kiełczewski

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

Вот пример:

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

У этого есть решение: которое преобразует метку времени Unix во время в JS, попробуйте это

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

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

Для lodash и подчеркивания пользователей используйте _.now.

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

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

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);
            }
};
12
Ron Royston

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

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

moment().unix();
9
Rimian

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

Date.now()

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

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

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

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

9
Olemak

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

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

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

timestamp : parseInt(new Date().getTime()/1000, 10)
5
DevC
var d = new Date();
console.log(d.valueOf()); 
3
jameslouiz

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

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

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

3
user257319

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

2
Eugene
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())));
}
1
unknown123

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

new Date().toISOString()

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

1
cenkarioz

Вот еще одно решение для генерации метки времени в 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);
0
Saucier
new Date().getTime(); and Date.now();

>> Return current timestamp

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

>> Return required timestamp
0
ashish