如何在 JavaScript 中获取时间戳?

How do I get a timestamp in JavaScript?

提问人:Pablo Fernandez 提问时间:10/21/2008 最后编辑:Mateen UlhaqPablo Fernandez 更新时间:1/9/2023 访问量:4183625

问:

我想要一个代表当前日期和时间的数字,就像 Unix 时间戳一样。

JavaScript 时间 日期算术

评论


答:

5982赞 daveb 10/21/2008 #1

时间戳(以毫秒为单位)

要获取自 Unix 纪元以来的毫秒数,请调用 Date.now

Date.now()

或者,使用一元运算符调用 Date.prototype.valueOf+

+ new Date()

或者,直接调用 valueOf

new Date().valueOf()

若要支持 IE8 及更早版本(请参阅兼容性表),请为以下项创建填充码Date.now

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

或者,直接调用 getTime

new Date().getTime()

时间戳(以秒为单位)

要获取自 Unix 纪元以来的秒数,即 Unix 时间戳

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

或者,使用按位或到地板速度稍快,但可读性也较差,并且将来可能会中断(参见解释 12):

Date.now() / 1000 | 0

以毫秒为单位的时间戳(更高分辨率)

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

评论

14赞 Umair Riaz 2/22/2021
如果您想知道符号的逻辑是:用作它将忽略所有字符并仅返回数字的地方plus+toInt()
0赞 WJA 1/2/2022
或使用在线工具:magictools.dev/#!/tools/timestamp-to-date
162赞 Staale 10/21/2008 #2
var time = Date.now || function() {
  return +new Date;
};

time();
102赞 aemkei 10/21/2008 #3
var timestamp = Number(new Date()); // current time as number
51赞 Tom Viner 5/1/2009 #4

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

630赞 xer0x 2/18/2011 #5

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

+new Date

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

Date.now()

评论

13赞 inanutshellus 7/8/2013
@Billy 我记得,我计算了两个建议的解决方案中的时间戳,每个 1M 次,并计算了平均运行时间。我在 Firefox 和 Chrome 中运行了它,getTime 在两种浏览器中都更快。也就是说,即使它(稍微)慢,我也会选择.幸运的是,更快的解决方案已经是清晰的解决方案!new Date().getTime()
11赞 Jason 7/18/2013
同意@FabrícioMatté。一元算子的行为可能不是初级的,但如果你还没有复习过它,不要指望能够在很多团队中有效地运作。
10赞 kirb 10/2/2013
@Niklaus那是因为你要把它连接到另一个字符串。在这种情况下,称为。new Date().toString()
3赞 ansiart 12/21/2014
在这种情况下,+ 是一元数学。typeof (+new Date()) 的计算结果为 “number”。基本上,它是 new Date().valueOf() 的简写——没有 javascript 函数调用。但不要这样写,它看起来像一个错别字。
3赞 xer0x 1/4/2017
@FelixGagnon-Grenier 我添加了它,因为它现在是首选方式,很多人不喜欢.我喜欢 daveb 的答案现在包括 ,并解释了它,但它也没有习惯。Date.now()+new Date+new Date
317赞 Daithí 5/12/2011 #6

JavaScript 使用自纪元以来的毫秒数,而大多数其他语言使用秒数。你可以用毫秒来工作,但一旦你传递一个值来表示 PHP,PHP 本机函数可能会失败。因此,为了确保我总是使用秒,而不是毫秒。

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

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

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

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

评论

0赞 Rob 10/27/2023
我更喜欢这个答案,因为它不会偷偷带入对 Math.floor() 的明显偏见。Math.floor() 的舍入误差最多可以达到一秒,而 Math.round() 的误差只有半秒。我认为 Math.floor() 的论点是它避免了技术上略微面向未来的“现在”时间戳。为什么与过去的“现在”时间戳相比,这如此令人震惊?使用 Math.floor(),它可能更不准确,仅仅是因为它不能产生“未来”时间戳,会造成过度思考的后果。
32赞 Salman A 5/3/2012 #7

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

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

将结果除以 1000 以获得 Unix 时间戳,如有必要,请下限

(new Date).getTime() / 1000

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

164赞 GottZ 7/12/2012 #8

我在此答案中提供了多种解决方案和描述。如果有任何不清楚的地方,请随时提出问题


快速而肮脏的解决方案:

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 年之后的日期:

按位运算将导致使用 32 位整数而不是 64 位浮点。

您需要将其正确用作:

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

如果你只想知道从代码第一次运行开始的相对时间,你可以使用这样的东西:

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

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

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


现在对 |0 的作用进行一个小小的解释:

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

在该转换过程中,将删除小数点,从而产生与 using 输出的结果类似的结果。Math.floor()

但请注意:它会将 64 位双精度转换为 32 位整数。
这将导致在处理大量数据时丢失信息。
由于 32 位整数溢出,时间戳将在 2038 年后中断,除非 Javascript 在严格模式下移动到 64 位整数。


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

48赞 live-love 9/22/2012 #9

总而言之,这里有一个在 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;
}
64赞 VisioN 3/15/2013 #10

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

var timestamp = $.now();

(此外,它只是实现了(new Date).getTime()表达式)

编号: http://api.jquery.com/jQuery.now/

17赞 SBotirov 5/9/2013 #11

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

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

评论

3赞 Salman A 5/7/2015
(改写我的评论)您的代码有问题:它执行 Date.now 方法,而不是先检查其支持。在较旧的浏览中,它会导致 Date.now 不是函数错误。
0赞 mgthomas99 4/4/2018
也许更好的选择是在尝试调用它之前使用三元运算符来断言它确实存在(并且是一个函数):。Date.nowcurrentTime = typeof Date.now === "function" ? Date.now() : +new Date()
23赞 deepakssn 5/21/2013 #12

下面是一个简单的函数,用于生成格式为: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赞 Inaimathi 8/24/2013
@b123400 - 这是 Lisp 版本: .(new (chain (-date) (to-i-s-o-string)))
15赞 Anoop P S 7/1/2013 #13

这个有一个解决方案:在js中将unixtimestamp转换为tim 试试这个

var a = new Date(UNIX_timestamp*1000);
var hour = a.getUTCHours();
var min = a.getUTCMinutes();
var sec = a.getUTCSeconds();
10赞 Vicky Gonsalves 10/26/2013 #14

更简单的方法:

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

评论

0赞 alexventuraio 9/23/2016
要知道从哪里来。你需要更好地解释你解决它的方式,而不是你写一个答案。请!event
0赞 sg28 1/18/2018
我正要写新的Date()对象。您可以控制台 log(new Date()),然后浏览 new Date() 对象/函数下的相关方法
36赞 Belldandu 3/31/2014 #15

我还没见过

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

另一个我还没见过的是

var _ = require('lodash'); // from here https://lodash.com/docs#now
_.now();
11赞 Rimian 3/6/2015 #16

Moment.js可以抽象出处理Javascript Dates的很多痛苦。

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

moment().unix();

评论

2赞 FullStack 7/14/2015
请注意,这给出了自 UNIX 纪元以来的秒数(而不是毫秒数)。如果需要毫秒数,请使用 。看我的答案。moment().valueOf()
15赞 georgez 3/11/2015 #17

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

下面是一个示例:

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

评论

0赞 sg28 1/18/2018
我正要写新的Date()对象。您可以控制台 log(new Date()),然后浏览 new Date() 对象/函数下的相关方法
13赞 Muhammad Reda 3/30/2015 #18

对于 lodashunderscore 用户,请使用 ._.now

var timestamp = _.now(); // in milliseconds
15赞 Kevinleary.net 5/29/2015 #19

如果想要一种在 Node.js 中生成时间戳的基本方法,这很有效。

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

我们的团队正在使用它来破坏本地主机环境中的缓存。输出是 其中 是 生成的时间戳。/dist/css/global.css?v=245521377245521377hrtime()

希望这会有所帮助,上面的方法也可以工作,但我发现这是满足我们在 Node.js 中需求的最简单方法。

24赞 iter 7/6/2015 #20

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

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

例如,这可以产生 ,而只给出 .1436140826653.139Date.now1436140826653

评论

0赞 jws 6/19/2023
记录为具有毫秒级分辨率,而不是微秒级。也已弃用。performance.timing.navigationStart
25赞 FullStack 7/14/2015 #21

我强烈建议使用 .要获取自 UNIX 纪元以来的毫秒数,请执行moment.js

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 的其他方法,请参阅其文档

22赞 blueberry0xff 9/29/2015 #22

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

17赞 Ronnie Royston 10/9/2015 #23

这似乎有效。

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);
            }
};
28赞 Valentin Podkamennyi 10/15/2015 #24

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

考虑跳过直接 getTime() 调用并用作 Math.floor() 函数的替代品。 同样值得记住的是,它是一个较短的等价物(大写字母 E 比小写字母更受欢迎,以指示为常量)。| 01E310001E3

因此,您将得到以下内容:

var ts = new Date / 1E3 | 0;

console.log(ts);

95赞 Joaquinglezsantos 1/29/2016 #25

除了其他选项之外,如果你想要一个日期格式的ISO,你可以直接得到它

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

22赞 Jitendra Pawar 3/16/2016 #26

您只能使用

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

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

54赞 Alireza 5/20/2017 #27

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

评论

0赞 electronixG 6/24/2023
谢谢,我在网上浏览了大量的答案,并得出了这个结论,但没有人证实。
12赞 Olemak 12/14/2017 #28

在撰写本文时,最重要的答案是 9 年前,从那时起发生了很多变化——尤其是,我们对非黑客解决方案的几乎普遍支持:

Date.now()

如果你想绝对确定这不会在一些古老的(ie9 之前)浏览器中中断,你可以把它放在一个检查后面,如下所示:

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

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

Date.now 上的 MDN 文档

52赞 Kamil Kiełczewski 6/28/2018 #29

性能

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

结论

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

enter image description here

chrome 的搜索结果

enter image description here

您可以在您的机器上执行测试 这里

测试中使用的代码如下图所示

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

22赞 cenkarioz 5/19/2019 #30

如果用于日志记录,则可以使用 ISOString

new Date().toISOString()

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