你如何获得JavaScript的时间戳?

pupeno 3844 javascript datetime timestamp date unix-timestamp

如何在JavaScript中获取时间戳?

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

daveb.. 4717

短而时髦:

+ 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对象.但是,如果您不想要填充程序和最大兼容性,则可以使用"旧"方法以毫秒为单位获取时间戳:

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

  • 不会`Date.now()/ 1000 | 0`遭遇[2038年问题](https://en.wikipedia.org/wiki/Year_2038_problem)?`new Date('2039年1月1日)/ 1000 | 0 == -2117514496` (52认同)
  • 虽然`+ new Data`很聪明,但其他开发人员无法读取.`Date.now()`更清晰,确保其他人都知道发生了什么. (42认同)
  • @MilanBabuškov但node.js确实支持`Date.now()` (14认同)
  • 另一个值得注意的例外是node.js. 我来自Google,希望在节点中做同样的事情 (11认同)
  • 甚至,没有使用Math.floor ..`~~(Date.now()/ 1000)` (3认同)

xer0x.. 497

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

+new Date

我也喜欢这个,因为它与现代浏览器一样短,并且与现代浏览器兼容,超过500人投票表示它更好:

Date.now()

  • 这个选项是个坏主意.它很容易被忽视,看起来像一个错字,实际上是依赖于语言的副作用.我看到糟糕的代码. (615认同)
  • 同意@FabrícioMatté.一元操作员的行为可能并不简陋,但如果你还没有完成它,那么就不要期望能够在很多团队中有效运作. (11认同)
  • @Billy我记得,我在两个建议的解决方案中计算了每次1M次的时间戳,并计算了平均运行时间.我在Firefox和Chrome中运行它,两个浏览器的getTime都更快.也就是说,即使它(稍微)慢了,我也会选择`new Date().getTime()`.幸运的是,更快的解决方案已经是清晰易懂的解决方案! (10认同)
  • @Niklaus那是因为你将它连接到另一个字符串.在这种情况下,调用`new Date().toString()`. (9认同)
  • 出于好奇,`+`运算符正在做什么使它像字符串一样出现? (7认同)
  • +0代表"*和超过357人投票认为它更好*"因为我们不会对SO进行投票.但+1为好的答案.而且因为它很有趣.; ^)(当它是一种语言特征时,我确实厌倦了"看起来像一个错字"的投诉."~~`是一个很大的截断,但人们提出同样的抱怨.但如果它不存在,有人会发明它,你知道吗?学习语言,357人!这很有趣.) (3认同)
  • 在这种情况下,+是一元数学.typeof(+ new Date())计算为"number".基本上它是新的Date().valueOf()的简写 - 没有javascript函数调用.但不要这样写,它看起来像一个错字. (2认同)
  • 如果它包含在单元测试中,那将不是一个问题。 (2认同)
  • @ FelixGagnon-Grenier我添加了`Date.now()`,因为它现在是首选的方式,很多人不喜欢`+ new Date`.我喜欢daveb的答案现在包括`+ new Date`,并解释它,但它也不习惯. (2认同)

Daithí.. 266

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

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

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

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

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

  • 使用地板而不是圆形.700毫秒仍然不是整秒 (48认同)
  • 虽然存在microtime(),但php中大多数与时间相关的函数都希望时间戳以秒为单位而不是毫秒.更重要的是microtime()返回一个float(如果你传递true),其中小数部分是秒的分数(精确到微秒),而newDate().getTime()返回一个int,它只计算毫秒数时代.例如(php)如果你要调用floor(microtime(true)),这实际上与调用time()是一样的,这是以秒为单位而不是微秒或毫秒.如上所述除以1000是最简单的解决方案. (5认同)
  • PHP应该在几毫秒内正常工作,因为它本身使用microtime()函数. (4认同)

Staale.. 143

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

time();

  • [Date.now()](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/now)来自JavaScript 1.5,IE 8不支持. (63认同)
  • 尚未更新以支持Date.now方法的引擎可以使用以下填充程序解决缺少它的问题:if(!Date.now){Date.now = function now(){return +(new Date); }; } (9认同)
  • 为何选择|| 运营商?Date.now()在所有浏览器上都不可用吗? (6认同)

GottZ.. 124

我在这个答案中提供了多个解决方案和描述.如果有什么不清楚,请随意提问
.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 )

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

这也将返回负值,但只有当您运行代码的PC用户将PC的时钟至少更改为去年12月31日时.


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

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

如果您正在使用jQuery,您可以使用jQuery的Docs中的$.now()描述,这使得polyfill过时,因为内部执行相同的操作:$.now()(new Date).getTime()

如果你对jQuery的版本感到高兴,请考虑提出这个答案,因为我自己并没有找到它.


现在对一个小小的解释|0:

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

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

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


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

  • | 0类似于Math.floor(),因为它是一个位操作(不适用于浮点数).通常它比Math.floor()更快,因为它不是函数调用,它是一个原生的javascript运算符. (11认同)
  • `Date.now()`参考:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/now (8认同)
  • 作为参考,你可以获得的最紧凑是`new Date/1e3 | 0`. (7认同)
  • polyfills /垫片并不复杂.它们是必须支持9种不同浏览器版本的结果,并且业界决定选择它们采用的标准以及它们刚刚组成的标准. (5认同)

aemkei.. 87

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


VisioN.. 61

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

var timestamp = $.now();

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

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

  • @VisioN谁说javascript需要在浏览器中使用? (5认同)
  • @PierreArlaud谁说这个问题只关于NodeJS? (5认同)
  • @VisioN我找了一种在Node.js中做时间戳的方法.我在stackoverflow中发现了一个javascript问题,我在jQuery中得到了一个答案,但没有帮助.Javascript和jQuery是两件事.如果我们给出每个javascript框架的答案,我们最终会得到一个可能无限多的答案,这与stackoverflow中的Q/A哲学相悖.另外:http://i.stack.imgur.com/Ledgt.gif:D (4认同)
  • jQuery还将处理与不同JavaScript API的任何跨浏览器兼容性问题. (2认同)
  • @KingRider在`parseInt`中没有必要,因为结果值总是一个`Number`. (2认同)

Tom Viner.. 44

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

  • 只做`Date.now()` (8认同)
  • 这等于```+ new Date``` .. :) (4认同)
  • @Orlando确切地说,不要只做Date.now() (4认同)

live-love.. 40

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

  • OP询问整数时间戳; 这是时间的字符串表示. (10认同)
  • "类似于Unix的时间戳,即代表当前时间的单个数字" (3认同)

Joaquinglezs.. 40

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

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


Alireza.. 35

日期,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();


Belldandu.. 29

一个我还没有看到的

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

另一个我还没有看到的是

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

  • 好.我确定编辑了`Math.floor()`但只是为了表明它与`| 0`具有相同的效果.我不想伤害你或任何东西.我只是想告诉你,你的回答已经存在了.通过查看所有给出的答案,有一些通知楼层在某种程度上. (3认同)

Salman A.. 27

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

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

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

(new Date).getTime() / 1000

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

  • 你不需要它们,但它们使代码更具可读性(恕我直言).我觉得味道很重要. (14认同)
  • 你不需要括号:`new Date().getTime()/ 1000` (7认同)

Valentin.. 24

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

考虑跳过直接getTime()调用并| 0用作Math.floor()函数的替代.记住1E3是一个较短的等价物1000(大写的E优于小写,表示1E3为常数).

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

var ts = new Date / 1E3 | 0;

console.log(ts);

  • 是的,不要手动缩小代码,特别是保存1个字节. (13认同)
  • @dchest`"Math.floor(new Date().getTime()/ 1000)".length == 37;``"new Date/1E3 | 0".length == 14;`37 -14 =**23**字节; (3认同)
  • @Valentin请向我解释一下,如何用`| 0`替换`Math.floor()`才能使此代码“清晰易懂”。请解释一下用1E3替换1000来节省1个字节的意义。这是荒唐的。我看到错误的代码。 (2认同)

FullStack.. 21

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


Jitendra Paw.. 21

你只能使用

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

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


Kamil Kiełcz.. 21

今天 - 2018.06.27我提供了纯js解决方案的时间比较.这对于想要以轻/高效方式获取/测量JS时间的人来说非常有用(例如,对于模拟,游戏等实时应用程序)

在Chrome 67.0.3396.99(64位),Safari 11.0.3(13604.5.6),Firefox 59.0.2(64位)上的MacOs High Sierra 10.13.3上进行了测试.在下面的屏幕截图中,我展示了最快浏览器(Safari)的结果:

在此输入图像描述

我观察到这Date.now()是获取所有三种浏览器时间戳的最快方法.Safari每秒运行19.2M,Firefox 16.1M,Chrome 7.8M.

new Date()*1Chrome浏览器(2.8M)和Firefox(2.6M)是最慢的.在Number(new Date())Safari浏览器(2.9M)是最慢的.

所以赢家JS代码是Date.now()最快的浏览器是Safari(比Chrome快2倍!).

您可以在此处对您的机器进行测试:https://jsperf.com/timestamp-test-x.


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

  • @ b123400 - 这是Lisp版本:`(new(chain(-date)(to-iso-string)))`. (9认同)

小智.. 20

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

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

这可以例如屈服1436140826653.139,而Date.now仅给出1436140826653.


blueberry0xf.. 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>


mr.boyfox.. 16

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

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

  • (改述我的评论)你的代码有一个问题:它执行Date.now方法而不是先检查它的支持.在较旧的browsres上它会导致_Date.now不是function_错误. (3认同)

Anoop P S.. 14

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

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


george.. 14

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

这是一个例子:

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


Kevin Leary.. 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中最简单的方法.


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


Muhammad Red.. 12

对于lodash下划线用户,请使用_.now.

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


Rimian.. 10

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

请参阅:http://momentjs.com/docs/#/displaying/unix-timestamp/

moment().unix();

  • 请注意,这给出了自UNIX时代以来的秒数(不是毫秒)。如果需要毫秒,请使用`moment()。valueOf()`。看我的答案。 (2认同)

Olemak.. 9

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

Date.now()

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

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

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

Date.now上的MDN文档


Vicky Gonsal.. 8

更简单的方法:

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


DevC.. 7

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

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


cenkarioz.. 7

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

new Date().toISOString()

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


归档时间:

查看次数:

2725288 次

最近记录:

1 年 前