您如何获得JavaScript时间戳?


Answers:


4908

简短而时髦:

+ 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对象。但是,如果您不希望使用Shim和最大的兼容性,则可以使用“旧”方法来获取时间戳(以毫秒为单位)

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


11
另一个值得注意的例外是node.js。我从Google来到这里,希望在节点上也做同样的事情
米兰·巴布斯科夫(MilanBabuškov),2015年

57
不会Date.now() / 1000 | 0遭受2038年的问题吗?new Date('Jan 1, 2039') / 1000 | 0 == -2117514496
gengkev

3
甚至不使用Math.floor。~~(Date.now() / 1000)
Matej

14
@MilanBabuškov,但node.js确实支持Date.now()
OrangeDog

51
虽然+new Data很聪明,但其他开发人员无法读取。Date.now()更清晰,并确保其他所有人都知道发生了什么事。
哈里·萨德勒

513

我喜欢这个,因为它很小:

+new Date

我也喜欢这样,因为它很短,并且与现代浏览器兼容,并且有500多人投票认为它更好:

Date.now()

636
这个选项是个坏主意。它很容易被忽略,看起来像是一个错字,实际上依赖于语言的副作用。我看到错误的代码。
inanutshellus 2012年

10
@Billy我记得,我在两个建议的解决方案中分别计算了1M次的时间戳,并计算了平均运行时间。我在Firefox和Chrome中运行它,两种浏览器中的getTime都更快。就是说,即使(稍微)慢一点,我也会选择new Date().getTime()。对我来说幸运的是,更快的解决方案已经是显而易见的解决方案!
inanutshellus

11
同意@FabrícioMatté。一元运算符的行为可能并不基本,但是如果您还没有对此进行梳理,不要指望在许多团队中都能有效发挥作用。
詹森·费瑟辛汉姆

9
@Niklaus那是因为您要将其连接到另一个字符串。在这种情况下,new Date().toString()称为。
kirb

7
出于好奇,+操作员正在做些什么使它像弦一样出来?
zadubz 2014年

275

JavaScript自时期起以毫秒为单位运行,而大多数其他语言以秒为单位运行。您可以以毫秒为单位工作,但是只要您传递一个值来表示PHP,PHP本机函数就可能会失败。因此,请确保我始终使用秒,而不是毫秒。

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

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

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

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

4
PHP应该可以在毫秒内正常工作,因为它本身可以与microtime()函数一起使用。
Nico Burns

5
当存在microtime()时,php中与时间相关的大多数功能都希望时间戳以秒为单位,而不是毫秒。更重要的是,microtime()返回一个浮点数(如果您通过true),其中小数部分是秒的分数(精确到微秒),而newDate()。getTime()返回一个int,该整数仅计算毫秒时代。例如(php)如果要调用floor(microtime(true)),则实际上与调用time()相同,后者以秒为单位,而不是微秒或毫秒。如上所述除以1000是最简单的解决方案。
gregghz 2012年

49
代替圆形,使用地板。700毫秒还不是整个第二
Anagmate

Unix timestampVS Seconds since the Epoch。这两个人不应该是同一件事吗?
Mudiaga Ejenavi '19

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

time();

6
为什么|| 操作员?Date.now()是否在所有浏览器上都不可用?
克里斯·诺

67
Date.now()来自JavaScript 1.5,IE 8不支持。
SørenLøvborg2011年

9
尚未更新为支持Date.now方法的引擎可以使用以下填充程序解决缺少该方法的问题:if(!Date.now){Date.now = function now(){return +(new Date); }; }
Per Quested Aronsson 2012年

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

130

我在此答案中提供了多种解决方案及其说明。如果有任何不清楚的地方,请随时提出问题
。PS:可悲的是,有人在没有给予任何嘉奖的情况下将其合并为最佳答案。


快速而肮脏的解决方案:

Date.now() /1000 |0

警告:如果执行魔术操作,它可能会在2038年中断并返回负数|0。使用Math.floor(),而不是由时间

Math.floor() 解:

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

Derek朕会功夫的一些书呆子替代方案来自于此答案下方的评论:

new Date/1e3|0

Polyfill开始Date.now()工作:

要使其在IE中工作,您可以执行以下操作(MDN的 Polyfill ):

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 )

当然,这会中断夏令时,但是根据您要构建的内容,如果在2038年int32中断后需要对时间戳进行二进制操作,这可能对您很有用。

这也将返回负值,但前提是您正在运行代码的那台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()

如果您只是对jQuery的版本感到满意,请考虑否决这个答案,因为我自己没有找到它。


现在简要说明一下|0功能:

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

在该转换过程中,将删除小数,从而得到与使用相同的结果,Math.floor()但使用的代码更少。

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


有关Date.now此链接的更多信息,请访问:Date.now()@ MDN


12
| 0与Math.floor()相似,因为它是位操作(不适用于浮点数)。通常它比Math.floor()更快,因为它不是函数调用,它是本机javascript运算符。
GottZ


@Christophe为什么这么认为?是因为IE修复?除了那部分,我认为它非常简单和可定制。
GottZ

5
polyfills /垫片并不复杂。它们的结果是必须支持9种不同的浏览器版本,并且业界决定选择采用哪些标准以及它们仅组成了哪些标准。
rlemon 2013年

8
作为参考,您可以获得的最紧凑的型号是new Date/1e3|0
德里克·朕会功夫2014年

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

61

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

var timestamp = $.now();

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

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


2
jQuery还将解决使用不同JavaScript API的任何跨浏览器兼容性问题。
亨利·海莱因2014年

4
@VisioN我正在寻找一种在Node.js中进行时间戳记的方法。我在stackoverflow中发现了一个JavaScript问题,并在jQuery中得到了答案,但没有帮助。Javascript和jQuery是两件事。如果我们为每个JavaScript框架提供答案,那么最终可能会有无限数量的答案,这与stackoverflow中的Q / A哲学背道而驰。另外:i.stack.imgur.com/Ledgt.gif:D
皮埃尔·

5
@VisioN谁说需要在浏览器中使用javascript?
皮埃尔·阿洛德

5
@PierreArlaud谁说这个问题仅与NodeJS有关?
VisioN

2
@KingRider不需要parseInt,因为结果值始终为Number
VisioN


43

除了其他选项外,如果您想要一个日期格式ISO,则可以直接获取它

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


它不返回整数并询问问题!
alexventuraio

@AlexVentura具有字符串dateformat ISO,您可以实例化日期对象并在它们之间减去。例如:new Date("2017-05-04T07:11:28.940Z") - new Date("2017-05-04T07:11:14.092Z")
Joaquinglezsantos

41

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

11
OP正在询问整数时间戳;这是时间的字符串表示形式。
布拉德·科赫

3
“类似于Unix的时间戳,即代表当前时间的单个数字”
Brad Koch 2013年

我有一个显示时间的代码,但是澳大利亚的部分地区显示了完整的日期,此脚本帮助我将其分解并正确显示。(为此+1)
Syfer '18

40

Date是JavaScript中的本机对象,是我们获取有关时间的所有数据的方式。

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

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

Date.now(); //return 1495255666921

在MDN中,提及如下:

Date.now()方法返回自1970年1月1日UTC以来经过的毫秒数。
由于now()是Date的静态方法,因此您始终将其用作Date.now()。

如果您使用的是低于ES5的版本,则Date.now();无法使用,您需要使用:

new Date().getTime();

29

我还没见过的那一个

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

我还没见过的另一个是

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

1
Date.now() /1000 |0做同样的
事情

3
好。我确实对其进行了编辑Math.floor(),但只是为了弄清楚它与|0。我不想伤害你或任何东西。我只是想告诉您,您已经以某种方式获得了答案。通过查看所有给定的答案,有些人会以某种方式注意到最低限度。
GottZ 2014年

我认为,导入整个Lodash库以供使用_.now()是有点过头了。我建议仅导入需要使用的Lodash功能(在本例中为NPM上的_.now()),但是即使他们已经弃用了其包,而只使用了Date.now()
mgthomas99 '18 -4-4

27

Date.getTime()方法可以稍作调整即可使用:

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

floor如果需要,将结果除以1000得到Unix时间戳:

(new Date).getTime() / 1000

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


7
您不需要括号:new Date().getTime() / 1000
Ry-

14
您不需要它们,但是它们使代码更具可读性(IMHO)。我想味道很重要。
约翰多多

你甚至都不需要()经过new Date.getTime()/定投Date对象分成若干反正。
德里克·朕会功夫2014年

25

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

考虑跳过直接getTime()调用并| 0用作Math.floor()功能的替代。最好记住它的1E3等价物更短1000(将大写字母E优先于小写字母E表示1E3为常数)。

结果,您得到以下信息:

var ts = new Date / 1E3 | 0;

console.log(ts);


3
@dchest "Math.floor(new Date().getTime()/1000)".length == 37; "new Date/1E3|0".length == 14; 37 -14 = 23字节;
Valentin Podkamennyi

@MatthieuCharbonnier到底是什么不可读?分隔符号,1E3,管道还是零?请在上面的答案中查看代码段。
Valentin Podkamennyi

1
@Valentin您正在压缩/简化简单的代码,几乎没有任何好处。我看不出这样做的意义。我们不在Code Golf上!
Matthieu Charbonnier

@MatthieuCharbonnier,没有什么复杂的,只有基本的语法和运算符。要点是编写简短,清晰易懂的代码。
Valentin Podkamennyi

2
@Valentin请解释我如何更换Math.floor()|0是使该代码“清晰易懂”。请解释一下替换1000为来节省1个字节的意义是什么1E3?这是荒唐的。我看到错误的代码。
Matthieu Charbonnier

24

性能

今天-2020.04.23我对所选解决方案进行测试。我在Chrome 81.0,Safari 13.1,Firefox 75.0的MacOs High Sierra 10.13.6上进行了测试

结论

  • 解决方案Date.now()(E)在Chrome和Safari上最快,在Firefox上排名第二,这可能是快速跨浏览器解决方案的最佳选择
  • performance.now()令人惊讶的是,解决方案(G)比Firefox上的其他解决方案快100倍以上,但在Chrome上最慢
  • 解决方案C,D,F在所有浏览器上的运行速度都很慢

在此处输入图片说明

细节

铬的结果

在此处输入图片说明

您可以在此处对计算机进行测试

测试中使用的代码显示在下面的代码片段中


如果您进行了测试performance.now(),我会很感兴趣,因为它在印章方面应该是最准确的。
SamsonTheBrave

@SamsonTheBrave感谢您的评论-我更新了答案
KamilKiełczewski

太好了,谢谢您的更新!我注意到您发现Firefox的性能现在有所不同。这可能是Firefox privacy.reduceTimerPrecision将结果四舍五入到最接近毫秒的结果。默认情况下,它也是启用的,但可以禁用。developer.mozilla.org/en-US/docs/Web/API/Performance/now
SamsonTheBrave

22

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


21

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

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

例如1436140826653.139,这可能会产生收益,而Date.now只能给出收益1436140826653


21

你只能用

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

获取当前时间戳。无需额外做任何事情。


20

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

10
@ b123400 -这里的Lisp语言的版本:(new (chain (-date) (to-i-s-o-string)))
Inaimathi

20

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


16

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

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

3
(重述我的评论)您的代码有问题:它执行Date.now方法,而不是先检查其支持。在较旧的浏览器上,这将导致Date.now不是函数错误。
Salman A

也许更好的选择Date.now是在尝试调用它之前,使用三元运算符断言实际存在(并且是一个函数)currentTime = typeof Date.now === "function" ? Date.now() : +new Date()
mgthomas99 '18 -4-4

14

这个有一个解决方案:将unixtime戳转换为js中的tim尝试这个

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

14

前几天,我从JQuery Cookie的源代码中学到了一种非常酷的方法,可以将给定的Date对象转换为Unix时间戳。

这是一个例子:

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

我将要编写新的Date()对象。您可以控制台log(new Date()),然后在新的Date()对象/函数下浏览相关方法
sg28

14

如果想要在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

这似乎有效。

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

13

如果用于记录目的,则可以使用ISOString

new Date().toISOString()

“ 2019-05-18T20:02:36.694Z”




9

撰写本文时,最高答案是9年了,此后发生了很多变化-尤其是,我们对非hacky解决方案几乎提供了普遍支持:

Date.now()

如果要绝对确定这不会在某些古老的(preie9)浏览器中出现,可以将其置于检查之后,例如:

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

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

Date.now上的MDN文档


8

更简单的方法:

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

不知道event从哪里来。您需要对解决方法进行更好的解释,而不是编写答案。请!
alexventuraio

我正要编写新的Date()对象。您可以控制台log(new Date()),然后在新的Date()对象/函数下浏览相关方法
sg28
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.