提问



如何在JavaScript中获取时间戳?


与Unix的时间戳类似的东西,也就是代表当前时间和日期的单个数字。无论是数字还是字符串。

最佳参考


简短&时髦:



+ new Date()


plus这样的一元运算符触发Date对象中的valueOf方法,它返回时间戳(没有任何改动)。


详细说明:


在几乎所有当前浏览器上,您可以使用Date.now()毫秒获取UTC时间戳;一个值得注意的例外是IE8及更早版本(见兼容性表)。[98] [99]


不过,你可以很容易地为此做一个垫片:


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

其它参考1


JavaScript使用自纪元以来的毫秒数,而大多数其他语言使用秒。您可以使用毫秒,但只要您传递一个值来表示PHP,PHP本机函数可能会失败。所以要确保我总是使用秒,而不是毫秒。


这将为您提供Unix时间戳(以秒为单位):


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


这将为您提供自纪元以来的毫秒数(不是Unix时间戳):


var milliseconds = new Date().getTime();

其它参考2


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

time();

其它参考3


我提供了多个解决方案,并在此答案中提供了说明。如果有任何不清楚的地方,请随时提出问题

PS:遗憾的是有人将此合并到最佳答案而没有给予信任。





快速而肮脏的解决方案


Date.now() /1000 |0



   警告:可能在2038年中断,如果您执行|0魔法,则返回负数。使用Math.floor()代替那个时间



Math.floor()解决方案:


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





Derek朕会功夫的一些书呆子替代方案取自以下评论: //stackoverflow.com/users/283863


new Date/1e3|0





Polyfill让Date.now()工作:


为了让它在IE中运行,你可以这样做(来自MDN的Polyfill):[102]


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年中断。

  
  这也将返回负值,但仅限于该PC的用户
  你正在运行你的代码正在改变他们的PC时钟至少
  去年12月31日。






如果您只想知道从代码运行到第一次的相对时间,您可以使用以下内容:


var relativeTime = (function () {
    var start = Date.now();
    return function () {
        return Date.now() - start
    }
})();





如果您正在使用jQuery,您可以使用$.now(),如jQuery的文档中所述,这使得polyfill过时,因为$.now()内部做同样的事情:(new Date).getTime() [103]


如果您对jQuery的版本感到高兴,请考虑提高这个的答案,因为我自己没有找到它。//stackoverflow.com/a/15434736/1519836





现在对|0的作用进行了微小的解释:


通过提供|,您告诉解释器执行二进制OR运算。位操作需要绝对数字,将Date.now() / 1000的十进制结果转换为整数。


在转换期间,删除小数,导致与使用Math.floor()相同的结果,但使用较少的代码。



  请注意:它会将64位双精度转换为32位整数。这会在处理大量数据时导致信息丢失。由于32位整数溢出,时间戳将在2038年后中断。






有关Date.now的更多信息,请点击此链接:Date.now() @ MDN [105]

其它参考4


var timestamp = Number(new Date()); // current time as number

其它参考5


jQuery 提供了自己的方法来获取时间戳:[106]


var timestamp = $.now();


(除了它只实现(new Date).getTime()表达式)


参考: http://api.jquery.com/jQuery.now/[107]

其它参考6


只是加起来,这是一个在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;
}

其它参考7




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



除了其他选项,如果你想要一个dateformat ISO,你可以直接得到它




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



一个我还没见过的人


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


另一个我还没见过的是


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

其它参考8


Date.getTime()方法可以使用一点点调整:[108]



  getTime方法返回的值是毫秒数
  自1970年1月1日00:00:00 UTC。



将结果除以1000得到Unix时间戳,floor如有必要:[109]


(new Date).getTime() / 1000





Date.valueOf()方法在功能上等同于Date.getTime(),这使得可以在日期对象上使用算术运算符来实现相同的结果。在我看来,这种方法会影响可读性。

其它参考9


代码Math.floor(new Date().getTime() / 1000)可以缩短为new Date / 1E3 | 0


考虑跳过直接getTime()调用并使用| 0作为Math.floor()函数的替代。
记住1E31000的较短等价物也是好的(大写E优于小写,表示1E3为常数)。[110] [111]]]


因此,您将获得以下信息:




var ts = new Date / 1E3 | 0;

console.log(ts);



JavaScript中的日期原生对象是我们获取所有时间数据的方式。


在JavaScript中要小心,时间戳取决于客户端计算机设置,因此它不是100%准确的时间戳。为了获得最佳结果,您需要从服务器端获取时间戳。


无论如何,我的首选方式是使用香草。这是在JavaScript中执行此操作的常用方法:


Date.now(); //return 1495255666921


在MDN中,它提到如下:



  Date.now()方法返回自此以来经过的毫秒数
  1970年1月1日00:00:00 UTC。

  因为now()是Date的静态方法,所以总是将它用作Date.now()。



如果您使用ES5以下的版本,Date.now();不起作用,您需要使用:


new Date().getTime();

其它参考10


这是一个生成时间戳的简单函数,格式为: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())));
}

其它参考11


我强烈建议使用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的其他方法,请参阅其文档[112]

其它参考12




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



对于具有微秒分辨率的时间戳,有performance.now:[113]


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


这可以例如产生1436140826653.139,而Date.now仅产生1436140826653

其它参考13


任何浏览器都不支持Date.now,您可以使用它来获取当前日期时间:


currentTime = Date.now() || +new Date()

其它参考14


这个有一个解决方案:在js中将unixtime标记转换为tim尝试这个


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

其它参考15


如果想要一种在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中最简单的方法。

其它参考16


前几天,我学会了一种非常酷的方法,将给定的Date对象转换为来自JQuery Cookie源代码的Unix时间戳。[114]


这是一个例子:


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

其它参考17


对于lodash和下划线用户,请使用_.now[115] [116]


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

其它参考18


这似乎有效。


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

其它参考19


Moment.js可以在处理Javascript日期时抽象出很多痛苦。 [117]


见:http://momentjs.com/docs/#/displaying/unix-timestamp/[118]


moment().unix();

其它参考20


在写这篇文章时,最重要的答案是9年,从那以后发生了很多变化 - 尤其是,我们几乎普遍支持非hacky解决方案:


Date.now()


如果你想绝对肯定这不会在一些古老的(pre ie9)浏览器中破解,你可以把它放在支票后面,如下:


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


这将返回自纪元时间以来的毫秒,当然,不是秒。


关于Date.now [119]的MDN文档

其它参考21


更简单的方法:


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

其它参考22


有时我需要在xmlhttp调用的对象中,所以我喜欢这样。


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

其它参考23


建议的正确方法是Number(new Date())
在代码可读性方面,


此外,UglifyJS和Google-Closure-Compiler将降低已解析的代码逻辑树的复杂性(如果您使用其中一个来隐藏/缩小代码,则相关)。


对于Unix时间戳,它具有较低的时间分辨率,只需将当前数字除以1000,保持整体。