Pablo Fernandez
Pablo Fernandez

Reputation: 287760

How do I get a timestamp in JavaScript?

I want a single number that represents the current date and time, like a Unix timestamp.

Upvotes: 4906

Views: 4558532

Answers (30)

wahwahwah
wahwahwah

Reputation: 3177

Isn't the correct answer to this question, "you can't?"

A bunch of the answers get to close approximation, and that's good enough in most circumstances, but there's always going to be an issue of precision. And, that issue gets expounded by code distance from server time.

Take the assumption server x is in true real time / unix time at 1 095 379 198.75

  1. Making a call to x from any available javascript platform will throw you out of sync with unix time, necessarily
  2. "Clocking" isnt really the intended use of javascript and javascript libraries

If you want to get precise with javascript, you have to bleed out server time (x) data through a socket, and redouble with a few checks. Such as "Did I get the 1 095 379 198.75 number correctly? What do I see by just running pure js time codes? (the answers address this.) Is the server time correct?" All of these checks will throw you off the x clock.

Does it matter? And are you using the correct tool for the job?

Precision tools like this need to be custom made and are sort of relative. Imagine you have a metronome that just will never stop, ever. It always ticks back and forth forever at the same pace in perpetuity. That's more reliable than any code you could write, but it's also isolated, you are the only one who can see it. But, instead of a literal "metronome" (y) you do it in code.

So, you have your server time (x,) you have your metronome (y,) and you have the js read out (z.) The mean of those three aspects is about as precise as you can get in an instant using js. But it's like the equivalent of bringing a hatchet to a burning building. Or throwing sand into the ocean. The "use case" matters pretty significantly.

So, I think the correct answer to this question is "no, you can't do it consistently."

Upvotes: -1

mdcq
mdcq

Reputation: 2026

With the upcoming Temporal API (stage 3), you can use the epoch* properties on Temporal.Instant.

For example, for the current timestamp in milliseconds you can use Temporal.Now

const instant = Temporal.Now.instant();
const timestamp = instant.epochMilliseconds;

Upvotes: 0

Mohamed Riyad
Mohamed Riyad

Reputation: 382

/**
 * Equivalent to PHP's time(), which returns
 * current Unix timestamp.
 *
 * @param  {string}  unit    - Unit of time to return.
 *                           - Use 's' for seconds and 'ms' for milliseconds.
 * @return {number}
 */
time(unit = 's') {
    return unit == 's' ? Math.floor(Date.now() / 1000) : Date.now()
}

Upvotes: -1

daveb
daveb

Reputation: 76261

Timestamp in milliseconds

To get the number of milliseconds since Unix epoch, call Date.now:

Date.now()

Alternatively, use the unary operator + to call Date.prototype.valueOf:

+ new Date()

Alternatively, call valueOf directly:

new Date().valueOf()

To support IE8 and earlier (see compatibility table), create a shim for Date.now:

if (!Date.now) {
    Date.now = function() { return new Date().getTime(); }
}

Alternatively, call getTime directly:

new Date().getTime()

Timestamp in seconds

To get the number of seconds since Unix epoch, i.e. Unix timestamp:

Math.floor(Date.now() / 1000)

Alternatively, using bitwise-or to floor is slightly faster, but also less readable and may break in the future (see explanations 1, 2):

Date.now() / 1000 | 0

Timestamp in milliseconds (higher resolution)

Use performance.now:

var isPerformanceSupported = (
    window.performance &&
    window.performance.now &&
    window.performance.timing &&
    window.performance.timing.navigationStart
);

var timeStampInMs = (
    isPerformanceSupported ?
    window.performance.now() +
    window.performance.timing.navigationStart :
    Date.now()
);

console.log(timeStampInMs, Date.now());

Upvotes: 6152

GottZ
GottZ

Reputation: 4947

I provide multiple solutions with descriptions in this answer. Feel free to ask questions if anything is unclear


Quick and dirty solution:

Date.now() /1000 |0

Warning: it might break in 2038 and return negative numbers if you do the |0 magic. Use Math.floor() instead by that time

Math.floor() solution:

Math.floor(Date.now() /1000);

Some nerdy alternative by Derek 朕會功夫 taken from the comments below this answer:

new Date/1e3|0

Polyfill to get Date.now() working:

To get it working in IE you could do this (Polyfill from MDN):

if (!Date.now) {
    Date.now = function now() {
        return new Date().getTime();
    };
}

If you do not care about the year / day of week / daylight saving time you need to remember this for dates after 2038:

Bitwise operations will cause usage of 32 Bit Integers instead of 64 Bit Floating Point.

You will need to properly use it as:

Math.floor(Date.now() / 1000)

If you just want to know the relative time from the point of when the code was run through first you could use something like this:

const relativeTime = (() => {
    const start = Date.now();
    return () => Date.now() - start;
})();

In case you are using jQuery you could use $.now() as described in jQuery's Docs which makes the polyfill obsolete since $.now() internally does the same thing: (new Date).getTime()

If you are just happy about jQuery's version, consider upvoting this answer since I did not find it myself.


Now a tiny explaination of what |0 does:

By providing |, you tell the interpreter to do a binary OR operation.
Bit operations require absolute numbers which turns the decimal result from Date.now() / 1000 into an integer.

During that conversion, decimals are removed, resulting in a similar result to what using Math.floor() would output.

Be warned though: it will convert a 64 bit double to a 32 bit integer.
This will result in information loss when dealing with huge numbers.
Timestamps will break after 2038 due to 32 bit integer overflow unless Javascript moves to 64 Bit Integers in Strict Mode.


For further information about Date.now follow this link: Date.now() @ MDN

Upvotes: 163

Joaquinglezsantos
Joaquinglezsantos

Reputation: 1630

In addition to the other options, if you want a dateformat ISO, you can get it directly

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

Upvotes: 99

Kamil Kiełczewski
Kamil Kiełczewski

Reputation: 92647

Performance

Today - 2020.04.23 I perform tests for chosen solutions. I tested on MacOs High Sierra 10.13.6 on Chrome 81.0, Safari 13.1, Firefox 75.0

Conclusions

  • Solution Date.now() (E) is fastest on Chrome and Safari and second fast on Firefox and this is probably best choice for fast cross-browser solution
  • Solution performance.now() (G), what is surprising, is more than 100x faster than other solutions on Firefox but slowest on Chrome
  • Solutions C,D,F are quite slow on all browsers

enter image description here

Details

Results for chrome

enter image description here

You can perform test on your machine HERE

Code used in tests is presented in below snippet

function A() {
  return new Date().getTime();
}

function B() {
  return new Date().valueOf();
}

function C() {
  return +new Date();
}

function D() {
  return new Date()*1;
}

function E() {
  return Date.now();
}

function F() {
  return Number(new Date());
}

function G() {
  // this solution returns time counted from loading the page.
  // (and on Chrome it gives better precission)
  return performance.now(); 
}



// TEST

log = (n,f) => console.log(`${n} : ${f()}`);

log('A',A);
log('B',B);
log('C',C);
log('D',D);
log('E',E);
log('F',F);
log('G',G);
This snippet only presents code used in external benchmark

Upvotes: 52

Ganesh
Ganesh

Reputation: 114

To get time, month, day, year separately this will work

var currentTime = new Date();
var month = currentTime.getMonth() + 1;
var day = currentTime.getDate();
var year = currentTime.getFullYear();

Upvotes: 0

Alireza
Alireza

Reputation: 104870

Date, a native object in JavaScript is the way we get all data about time.

Just be careful in JavaScript the timestamp depends on the client computer set, so it's not 100% accurate timestamp. To get the best result, you need to get the timestamp from the server-side.

Anyway, my preferred way is using vanilla. This is a common way of doing it in JavaScript:

Date.now(); //return 1495255666921

In MDN it's mentioned as below:

The Date.now() method returns the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC.
Because now() is a static method of Date, you always use it as Date.now().

If you using a version below ES5, Date.now(); not works and you need to use:

new Date().getTime();

Upvotes: 55

Belldandu
Belldandu

Reputation: 2392

One I haven't seen yet

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

Another one I haven't seen yet is

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

Upvotes: 35

ajithes1
ajithes1

Reputation: 427

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

Upvotes: 0

Valentin Podkamennyi
Valentin Podkamennyi

Reputation: 7369

The code Math.floor(new Date().getTime() / 1000) can be shortened to new Date / 1E3 | 0.

Consider to skip direct getTime() invocation and use | 0 as a replacement for Math.floor() function. It's also good to remember 1E3 is a shorter equivalent for 1000 (uppercase E is preferred than lowercase to indicate 1E3 as a constant).

As a result you get the following:

var ts = new Date / 1E3 | 0;

console.log(ts);

Upvotes: 27

Olemak
Olemak

Reputation: 2141

As of writing this, the top answer is 9 years old, and a lot has changed since then - not least, we have near universal support for a non-hacky solution:

Date.now()

If you want to be absolutely certain that this won't break in some ancient (pre ie9) browser, you can put it behind a check, like so:

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

This will return the milliseconds since epoch time, of course, not seconds.

MDN Documentation on Date.now

Upvotes: 11

xer0x
xer0x

Reputation: 13156

I like this, because it is small:

+new Date

I also like this, because it is just as short and is compatible with modern browsers, and over 500 people voted that it is better:

Date.now()

Upvotes: 640

Tom Viner
Tom Viner

Reputation: 6793

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

Upvotes: 50

Ronnie Smith
Ronnie Smith

Reputation: 18585

This seems to work.

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

Upvotes: 16

FullStack
FullStack

Reputation: 6020

I highly recommend using moment.js. To get the number of milliseconds since UNIX epoch, do

moment().valueOf()

To get the number of seconds since UNIX epoch, do

moment().unix()

You can also convert times like so:

moment('2015-07-12 14:59:23', 'YYYY-MM-DD HH:mm:ss').valueOf()

I do that all the time. No pun intended.

To use moment.js in the browser:

<script src="moment.js"></script>
<script>
    moment().valueOf();
</script>

For more details, including other ways of installing and using MomentJS, see their docs

Upvotes: 24

iter
iter

Reputation: 406

For a timestamp with microsecond resolution, there's performance.now:

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

This could for example yield 1436140826653.139, while Date.now only gives 1436140826653.

Upvotes: 24

Kevinleary.net
Kevinleary.net

Reputation: 9700

If want a basic way to generate a timestamp in Node.js this works well.

var time = process.hrtime();
var timestamp = Math.round( time[ 0 ] * 1e3 + time[ 1 ] / 1e6 );

Our team is using this to bust cache in a localhost environment. The output is /dist/css/global.css?v=245521377 where 245521377 is the timestamp generated by hrtime().

Hopefully this helps, the methods above can work as well but I found this to be the simplest approach for our needs in Node.js.

Upvotes: 14

Salman Arshad
Salman Arshad

Reputation: 272316

The Date.getTime() method can be used with a little tweak:

The value returned by the getTime method is the number of milliseconds since 1 January 1970 00:00:00 UTC.

Divide the result by 1000 to get the Unix timestamp, floor if necessary:

(new Date).getTime() / 1000

The Date.valueOf() method is functionally equivalent to Date.getTime(), which makes it possible to use arithmetic operators on date object to achieve identical results. In my opinion, this approach affects readability.

Upvotes: 31

jameslouiz
jameslouiz

Reputation: 394

var d = new Date();
console.log(d.valueOf()); 

Upvotes: 5

Muhammad Reda
Muhammad Reda

Reputation: 27053

For lodash and underscore users, use _.now.

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

Upvotes: 12

user257319
user257319

Reputation:

The advised, proper way is Number(new Date()), in terms of code- readability,

Also, UglifyJS and Google-Closure-Compiler will lower the complexity of the parsed code-logic-tree (relevant if you are using one of them to obscure/minify your code).

for Unix timestamp, which has a lower time resolution, just divide current number with 1000, keeping the whole.

Upvotes: 5

Eugene
Eugene

Reputation: 2974

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

Upvotes: 3

georgez
georgez

Reputation: 735

I learned a really cool way of converting a given Date object to a Unix timestamp from the source code of JQuery Cookie the other day.

Here's an example:

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

Upvotes: 14

Rimian
Rimian

Reputation: 38438

Moment.js can abstract away a lot of the pain in dealing with Javascript Dates.

See: http://momentjs.com/docs/#/displaying/unix-timestamp/

moment().unix();

Upvotes: 10

Saucier
Saucier

Reputation: 4370

Here is another solution to generate a timestamp in JavaScript - including a padding method for single numbers - using day, month, year, hour, minute and seconds in its result (working example at 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);

Upvotes: 2

Staale
Staale

Reputation: 28008

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

time();

Upvotes: 162

DevC
DevC

Reputation: 7423

sometime I need it in objects for xmlhttp calls, so I do like this.

timestamp : parseInt(new Date().getTime()/1000, 10)

Upvotes: 8

Vicky Gonsalves
Vicky Gonsalves

Reputation: 11717

more simpler way:

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

Upvotes: 9

Related Questions